Java final變量和普通變量的差別
今天在檢視以前在達内教育訓練的筆記時候,發現了Final關鍵字的使用筆記,其中有一個是關于Java類中final變量和普通變量的差別。對于java開發人員來說,final關鍵字是不陌生的,因為在使用匿名内部類的時候可能會經常的用到final關鍵字。
翻看筆記,在部落格裡面記錄下來final變量和普通變量的差別,有不正之處,希望大神指正。
當用final作用于類的成員變量時,成員變量,注意是類的成員變量,局部變量隻需要保證在使用之前被初始化指派即可,必須在定義時或者構造器中進行初始化指派,而且final變量一旦被初始化指派之後,就不能再被指派了。
public static void main(String[] args) {
String a ="hello_yomoer_2";
final String b = "hello_yomoer_";
String d = "hello_yomoer_";
String c = b + 2;
String e = d + 2;
System.out.println((a == c));
System.out.println((a == e));
}
輸出結果為:
true
false
大家可以先想一下這道題的輸出結果。為什麼第一個比較結果為true,而第二個比較結果為fasle。這裡面就是final變量和普通變量的差別了,當final變量是基本資料類型以及String類型時,如果在編譯期間能知道它的确切值,則編譯器會把它當做編譯期常量使用。也就是說在用到該final變量的地方,相當于直接通路的這個常量,不需要在運作時确定。這種和C語言中的宏替換有點像。是以在上面的一段代碼中,由于變量b被final修飾,是以會被當做編譯器常量,是以在使用到b的地方會直接将變量b替換為它的 值。而對于變量d的通路卻需要在運作時通過連結來進行。想必其中的差別大家應該明白了,不過要注意,隻有在編譯期間能确切知道final變量值的情況下,編譯器才會進行這樣的優化,如下面的這段代碼就不會進行優化:
public static void main(String[] args) {
String a ="hello_yomoer_2";
final String b = getHello();
String c = b + 2;
System.out.println((a == c));
}
public static StringgetHello() {
return "hello_yomoer_";
}
上面這段代碼輸出的結果為:false
關于更多final關鍵字的介紹和使用,網絡上有很多文章可供借鑒。
文章作者:demon
文章來源[http://outofmemory.cn/code-snippet/35911/Java-final-variable-putong-variable-differentiate](http://outofmemory.cn/code-snippet/35911/Java-final-variable-putong-variable-differentiate)