1. 程式人生 > >Java非靜態內部類為什麼不能有靜態成員

Java非靜態內部類為什麼不能有靜態成員

對於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;
     }
}