2016-03-08 118 views
3

我學習了C++,現在正在學習Java。在C++中,我們可以在非靜態/實例成員函數中使用靜態成員。但是,在學習Java的我發現這一點:Java的靜態成員和C++的靜態成員之間的區別

enter image description here

我寫了一個程序,以檢查是否「非靜態函數可以訪問靜態成員或沒有」。還有在下面的程序沒有問題:

public class Animal 
{ 
    static int CountOfAnimal; 
    public Animal() 
    { 
     CountOfAnimal++; 
    } 
    public int showCount() 
    { 
     CountOfAnimal++; 
     return CountOfAnimal; 
    } 
    public static void main(String []args) 
    { 
     new Animal(); 
     new Animal(); 
     Animal C = new Animal(); 
     System.out.println("Total animals are : " + C.showCount()); 
    } 
} 

所以,我可以說,在Java也非靜態/實例成員函數可以訪問同一類的靜態成員?

另外,我想知道除了調用成員的方式之外,Java和C++中的靜態成員(方法和變量)是否有區別?

我知道的一個區別是在C++中調用靜態成員並在Java中調用靜態成員。任何其他?

+1

'我可以說,在Java也非靜態/實例成員函數可以訪問同一類的靜態成員'是的,你可以嗎?。你所引用的這段話並不矛盾,所以目前還不清楚爲什麼你一開始就懷疑這個提議。 –

+0

@IgorTandetnik:謝謝,所以java和C++的靜態成員之間沒有其他區別(接受調用的方式)? – Infinity

+0

這個問題是基於對引用文本的誤解。投票結束。 – Galik

回答

2

是的。請注意,它並沒有說非靜態方法不能訪問靜態類成員,這就是你的代碼所做的。它表示靜態方法不能訪問非靜態類成員(或方法)。這是相反的方式。

對於完全相同的基本原因,C++也是如此。

0

像Sam Varshavchik所說的「靜態方法不能訪問非靜態類成員」。

對於你的其他問題,什麼是靜態在C++和Java之間的區別。

C++支持靜態局部變量。 Java不。

例如:在C++中完全有效,但在Java中出錯。

static int fun() { 
    static int abc = 1; 
    } 

的Java支持靜態塊/靜態類。 C++不

例:

static 
{ 
    System.out.println("Static block called"); 
} 

class TestOuter1{ 
    static int data=30; 
    static class Inner{ 
    void msg(){System.out.println("data is "+data);} 
    } 
    public static void main(String args[]){ 
    TestOuter1.Inner obj=new TestOuter1.Inner(); 
    obj.msg(); 
    } 
} 
+0

C++中的所有嵌套類都等同於Java中的靜態內部類。 C++ 11 lambda表達式與Java中的非靜態內部類相當,它們以捕獲本地變量的方式。 –

+0

@SamVarshavchik好吧,我不知道C++ Lambda。但是Java中的靜態內部類與C++內部類很不相同。 AFAIK,C++內部類可以訪問外部類的私有變量,但是由於只允許訪問靜態變量,所以Java中不支持這些變量。 所以我會說C++的內部類有點類似於Java的內部類而不是Java的靜態類。你會同意嗎? –

+0

@Infinity,如果這被回答。你能接受答案並解決問題嗎? –