1. 程式人生 > >Java中 static/transient,final/volatile 說明

Java中 static/transient,final/volatile 說明

你可以任意使用如下的修改限定關鍵字來定義一個欄位:final或者volatile和/或者static和/或者transient。
如果你將一個欄位定義為final,編譯器將確保欄位當成一個常量——只讀變數來初始化和處理。因為編譯器知道常量是不變的,所以在程式的位元組碼中對其進行了內部優化。 class Employee

{

final int ACCOUNTANT = 1;

final int PAYROLL_CLERK = 2;

final int MANAGER = 3;



int jobID = ACCOUNTANT;

} 如果你將一個欄位宣告為volatile,則多執行緒將能訪問此欄位,而特定的編譯器將防止最優化以使該欄位能被適當的訪問。 如果你將一個欄位定義為static,則所有物件都將共享此欄位的一份拷貝。當你將一個新值賦給這個欄位時,所有物件都將得到這個新值。如果沒有指定為static,則這個欄位將是一個例項欄位,每個物件都使用他們自己的一份拷貝。
定義為transient的欄位值在物件序列化過程中將不被儲存。 例項欄位
“例項欄位”就是沒有使用static修改識別符號定義的欄位。例項欄位和物件緊密相連——而不是和類。當在一個物件程式碼裡修改時,僅僅這個相關的類例項——物件——可以得到這個改變。例項欄位隨物件的建立而建立,隨物件的釋放而釋放。
類欄位
類欄位是用static關鍵字定義的欄位。類欄位和類聯絡——而不是物件。當在一個類程式碼中修改時,這個類(以及所有建立的物件)都能感知這個變化。類欄位隨類的載入而建立,隨類的解除安裝而釋放 常量
“常量”是一種只讀變數;當JVM初始化這種變數後,變數的值就不能改變了。
使用final關鍵字來定義常量。正如有兩種欄位——例項和類欄位,常量也有兩種——例項常量和類常量。為了提高效率,應當建立類常量,或者說是final static欄位。 class Constants

{

final int FIRST = 1;

final static int SECOND = 2;



public static void main(String[] args)

{

int iteration = SECOND;



if (iteration == FIRST)//編譯錯誤

System.out.println(“first iteration”);

else

if (iteration == SECOND)

System.out.println(“second iteration”);

}

}
上例中的Constants類定義了一對常量——FIRST和SECOND。FIRST是例項常量,因為JVM給每個Constants物件分配一份FIRST的拷貝。相反的,因為JVM在載入Constants類後只建立了一份SECOND拷貝,所以SECOND是類常量。
注意:當你嘗試在main()中直接訪問FIRST時會導致一個編譯錯誤。常量FIRST直到一個物件建立時才存在,所以FIRST僅僅只能被這個物件所訪問——而不是類。