2014-04-19 45 views
0

我有問題,在我的腦海,爲什麼任何繼承靜態變量和方法是subclass.Isn`t它違反了關鍵字static的非靜態方法訪問? 代碼爲什麼繼承靜態變量可以通過子類的非靜態方法訪問?

package com.pack1; 
public class MyClass { 
    static protected int testpro =100; 

    protected static void chkstat() 
    { 
     System.out.println("check stat"); 
    } 
} 


package com.pack2; 
import com.pack1.MyClass; 
public class Test extends MyClass { 
    public void fromsup() { 
     System.out.println("" + this.testpro + ""); 
     testpro = 200; 
     chkstat(); 
    } 

    public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    Test tt = new Test(); 
    tt.fromsup(); 
    } 
} 
+2

* 「Isn't它違反關鍵字的靜態?」 * - 關鍵字不能被 「侵犯」。最糟糕的是它可能與你的「靜態」應該如何表現的心理模型相矛盾。但那只是意味着你的心智模式是不正確的。 –

回答

0

不只是子類,它們是可訪問的,好像他們是在類內部的實例變量也是如此。這只是Java語法的怪癖,它在JLS,§8.3.1.1§15.11(特別§15.11.1)提及。基本上,被評估之前.表達(在您的情況下,這是一個非常簡單的表達式:this),並且如果它是指一個實例,該結果被丟棄,並且僅使用類型的信息。

0

,如果你希望他們不會被子類入店您可以創建一個私有靜態方法和變量。訪問規則的相同原則適用。

0

由於(在你的情況fromsup)靜態變量的同一副本我看不出有違反任何形式的的類的所有實例共享。

考慮這個

Test ob=new Test(); 
ob.fromsup=12; 
Test oc=new Test(); 
System.out.println(oc.fromsup); 

輸出仍然是12 ..

相關問題