Java中 static/transient,final/volatile 說明2008-05-22 11:06你可以任意使用如下的修改限定關鍵字來定義一個字段: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僅僅只能被這個對象所訪問——而不是類。
</script>