如:
public class InnerClassDemo{
int x;
class A{
static int a = 0;//這樣寫是不合法的.
static final int b=0;//這樣寫是合法的
}
}
java類加載順序,首先加載類,執行static變量初始化,接下來執行對象的創建,如果我們要執行代碼中的變量int a 初始化,那么必須先執行加載外部類,再加載內部類,最后初始化靜態變量 a ,問題就出在加載內部類上面,我們可以把內部類看成外部類的非靜態成員,它的初始化必須在外部類對象創建后以后進行,要加載內部類必須在實例化外部類之后完成 ,java虛擬機要求所有的靜態變量必須在對象創建之前完成,這樣便產生了矛盾。
(有點繞,呵呵)
而java常量放在內存中常量池,它的機制與變量是不同的,編譯時,加載常量是不需要加載類的,所以就沒有上面那種矛盾。