java-為什麽非靜態內部類中不能有static修飾的屬性,但卻可以有final常量?
阿新 • • 發佈:2018-12-21
static變量 虛擬機 修飾 要求 public col 什麽 常量 logs
- 例:
1 public class Demo{ 2 int x; 3 class A{ 4 static int a = 0; //這樣寫是不合法的. 5 static final int b=0; //這樣寫是合法的 6 } 7 }
- java類加載順序,首先加載類,執行static變量初始化,接下來執行對象的創建,如果我們要執行代碼中的變量int a 初始化,那麽必須先執行加載外部類,再加載內部類,最後初始化靜態變量 a ,問題就出在加載內部類上面,我們可以把內部類看成外部類的非靜態成員,它的初始化必須在外部類對象創建後以後進行,要加載內部類必須在實例化外部類之後完成 ,java虛擬機要求所有的靜態變量必須在對象創建之前完成,這樣便產生了矛盾。
- 而java常量放在內存中常量池,它的機制與變量是不同的,編譯時,加載常量是不需要加載類的,所以就沒有上面那種矛盾。
- 引用:https://www.cnblogs.com/wq3435/p/6243474.html
java-為什麽非靜態內部類中不能有static修飾的屬性,但卻可以有final常量?