天天看點

Java final變量和普通變量的差別Java final變量和普通變量的差別

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)