2014-09-06 57 views
-1

說你有兩個類,如下所示:在Java中,爲什麼存儲爲父級的子級調用父級的靜態方法,但訪問子級的靜態數據成員?

class A{ 
    static int statint = 5; 
    int instanceint = 5; 
    public void instanceMethod(){} 
    public static void staticMethod(){} 
} 

class B extends A{ 
    static int statint = 6; 
    int instanceint = 6; 
    public void instanceMethod(){} 
    public static void staticMethod(){} 
} 

,然後你實例如下:

public static void main(String[] args){ 
    A basa =new B(); //child(B) stored as parent(A) type 
    int i=basa.statint; /**gives you (child)B's static data member (6)**/ 
    int j=basa.instanceint; //gives you (parent)A's instance data member (5) 
    basa.instanceMethod(); //calls (child)B's instanceMethod() version. 
    basa.staticMethod(); /**call's (parent)A's staticMethod() version.**/ 
} 

我的問題是:孩子的靜態方法爲什麼能隱藏父的靜態數據成員,但不父母的靜態方法?我會認爲這不是或兩者兼而有之。我知道解決這個問題的方法 - 例如,對於靜態數據成員/方法訪問,使用ClassName.datamemberClassName.method()表示法來確保調用正確的版本,例如變量,明確地向下將要存儲的孩子存儲在訪問變量時的子類型,與((B)basa).instanceint;一樣,以獲得B的實例數據成員 - 我的問題更多的是爲了我自己的理解,爲什麼默認值對於隱藏靜態數據成員和從實例訪問的隱藏靜態方法看起來不一致)

+0

[無法重現。](http://ideone.com/lKddAK) – user2357112 2014-09-06 07:07:18

+0

它沒有。你誤會了。 – EJP 2014-09-06 07:54:05

回答

1

其實你的評論:

/** gives you (child)B's static data member (6) **/ 

是錯誤的。我的值是5,Java在這裏是一致的。

+0

對不起。它一定是我的代碼中的東西。 – Mer 2014-09-06 07:22:23

相關問題