2016-12-07 229 views
3

我是java的新手。我正在閱讀一些關於靜態變量的文章。當我試圖實現我的學習時,我遇到了一個關於靜態變量的問題。這是第一個代碼示例。在Java中的非靜態類中聲明靜態變量

public class Human { 
    // in Human.java 
    public static int population = 0; 
    public static void main(String[] argv) { 
     System.out.println(population); 
    } 
} 

此代碼工作正常,結果爲0。 但對於下面的代碼,我是不允許編譯。

public class Human { 
    // in Human.java 
    public class Charlie extends Human { 
     public static int number = 0; 
    } 

    public static void main(String[] argv) { 
     System.out.println(new Human().new Charlie().number); 
    } 
} 

中出現錯誤:場數不能聲明在非靜態內部類的靜態的,除非有一個常量表達式

我很困惑這種情況初始化。對於第一個代碼示例,我的Human類是非靜態的,我可以在其中聲明一個靜態變量。我爲什麼不能爲我的第二個代碼示例做同樣的事情。

任何幫助,將不勝感激。謝謝。 :)

回答

4

嘗試使用public static final int number = 0;,因爲Java不允許您在函數本地內部類中定義非最終靜態字段。只有頂級類和靜態嵌套類才允許有非最終靜態字段。

JLS section 8.1.3

內部類可以不聲明靜態成員,除非它們是常數變量(§4.12.4),或編譯時會出現誤差。

其他方法,使內部類的靜態和訪問它

public class Human { 
    // in Human.java 
    public static class Charlie extends Human { 
     public static int number = 0; 
    } 

    public static void main(String[] argv) { 
     System.out.println(new Human.Charlie().number); 
    } 
} 
+0

其他方式將使得查理類的靜態。可能值得一提 – Aelop

+0

我明白了。 Java有這個限制的原因嗎?這是否意味着Java虛擬機會處理與外部類不同的內部類? – FunnyFunkyBuggy

+0

@Aelop對..我剛剛更新了我的答案。 – iMBMT