1. 程式人生 > >final、static、static final區別

final、static、static final區別

final、static、static final修飾的欄位賦值的區別

static

static修飾的欄位: 在類載入過程中的準備階段被初始化為0或null等預設值,而後在初始化階段(觸發類構造器<clinit>)才會被賦予程式碼中設定的值,如果沒有設定值,那麼它的值就為預設值。

final

final修飾的欄位: 在執行時被初始化(可以直接賦值,也可以在例項構造器中賦值),一旦賦值便不可更改;

static final

static final修飾的欄位: 在Javac時生成ConstantValue屬性,在類載入的準備階段根據ConstantValue的值為該欄位賦值,它沒有預設值,必須顯式地賦值,否則Javac時會報錯。可以理解為在編譯期即把結果放入了常量池中。

final、static、static final修飾引用型別時的區別

static

static修飾的引用型別:是在載入類的時候,load到方法區的;是這個類的例項共有的類方法or屬性;引用的地址可以變,裡面具體的內容也可以變

final

final修飾的引用型別:是在堆記憶體new出來的;(如物件)可以被賦值一次,引用地址不可變,但物件裡面的內容(如屬性值)可以變。

static final

static final修飾的引用型別:是在載入類的時候,load到方法區的(同static);可以被賦值一次,引用地址不可變,但物件裡面的內容(如屬性值)可以變(同final);