2014-01-09 36 views
6

考慮下面的例子 爲什麼我們限制在內部類中聲明靜態成員變量時對內部類中繼承靜態變量沒有任何限制爲什麼我們被限制在java的內部類中聲明靜態成員變量?

public class Outer { 

    public class Inner { 

     public static String notAllowed; 
     /* Above line give following compilation error 
     The field notAllowed cannot be declared static in a non-static inner type, unless initialized with a constant expression 
     */ 

    } 

} 

但是現在如果我的內部類擴展了包含靜態變量的其他類,則此工作正常。 考慮下面的代碼:

public class Outer { 

    public class Inner extends InnerBase { 
     /* Since it extends InnerBase so we can access Outer.Inner.allowed */ 
     public Inner(){ 
      Outer.Inner.allowed = null; // Valid statement 
     } 
    } 

} 

public class InnerBase { 

    public static String allowed; 

} 

那麼究竟是什麼在內部類限制靜態變量的原因,它是通過繼承實現的? 我是否缺少一些非常基本的東西?

+0

因爲'Inner'類定義本身不是靜態的嗎? –

+2

http://stackoverflow.com/questions/1953530/why-does-java-prohibit-static-fields-in-inner-classes –

+0

注意,在你的第二個例子中,你沒有聲明一個'static' 'Inner'中的字段,你只是簡單的給它賦值。 –

回答

1

因爲要訪問靜態字段,您將需要類的實例,從中您將不得不創建非靜態Inner類的實例。

static字段不應該綁定到實例,因此您會收到編譯錯誤。

JLS 8.1.3規定了:

內部類可以不聲明靜態初始化或構件 接口,或編譯時會出現誤差。

內部類可能不會聲明靜態成員,除非它們是常量 變量或發生編譯時錯誤。

+0

Downvoter,介意要exlplain? –

1

從甲骨文網站:

1)與實例方法和變量,一個內部類與它包圍類的實例相關聯,並擁有該對象的方法和字段的直接訪問。

2)因爲內部類與一個實例相關聯,所以它不能自己定義任何靜態成員。

我的理解是這樣的:

如果內部類有自己的靜態字段和靜態字段具有類實例化之前進行初始化;

但是innner類只與outterclass的實例存在,所以它在實例化之前不能初始化它的靜態成員,然後是矛盾的。

+0

+1我更喜歡你的理解...... :) –

相關問題