1. 程式人生 > >java-為什麽非靜態內部類中不能有static修飾的屬性,但卻可以有final常量?

java-為什麽非靜態內部類中不能有static修飾的屬性,但卻可以有final常量?

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常量?