Java非靜態內部類為什麼不能有靜態成員
阿新 • • 發佈:2018-12-26
對於java類載入順序我們知道,首先載入類,執行static變數初始化,接下來執行物件的建立,如果我們要執行程式碼中的變數i初始化,那麼必須先執行載入OuterClass,再載入Innerclass,最後初始化靜態變數i,問題就出在載入Innerclass上面,我們可以把InnerClass看成OuterClass的非靜態成員,它的初始化必須在外部類物件建立後以後進行,要載入InnerClass必須在例項化OuterClass之後完成 ,java虛擬機器要求所有的靜態變數必須在物件建立之前完成,這樣便產生了矛盾。
Verion 0.11:
對於紅色標記的部分,當時理解上有誤,我們知道InnerClass可以有靜態常量(static final),那麼InnerClass類載入一定在OuterClass物件建立之前完成。
public class OuterClass { static int k = printI(); static int printI(){ System.out.println("Inner Class is loading before creating OuterClass instance"); return InnerClass.i ; } OuterClass(){ System.out.println("OuterClass constructor"); } class InnerClass{ private static final int i = 1; } public static void main(String[] args) { OuterClass o; } } //* out: // Inner Class is loading before creating OuterClass instance
2 靜態內部類可以有靜態成員:
我們可以把靜態內部類作為外部類OuterClass的一個靜態成員,在執行類載入過程中,靜態內部類在載入OuterClass後會進行初始化,同樣的原理,靜態內部類的靜態成員也將被初始化,進行記憶體的分配,注意到,這時無論是內部類還是外部類,物件都沒有例項化,這也說明了非靜態內部類為什麼不能有靜態成員的原因。
public class OuterClass{
static class InnerClass{
private static int i;
}
}