java基礎——2final不簡單

        final——一個並不陌生的java關鍵字,修飾變變量(包括實例變量,類變量)、方法、類。下面一行很經常使用到的code:
public static final String BACE_INFO = "baseinfo";
        首先,先明確一下,
  1. final修飾的變量不能夠從新賦值。
  2. final修飾的方法不能夠被重寫。
  3. final修飾的類不能夠派生子類。
  4. final修飾的實例變量必須顯式的指定初始值,而且只能在如下三個位置初始化。
public class FinalInstanceTest{
    //定義變量時初始化
    final int var1 = 2;
    final String var2;
    final double var3;

    //非靜態初始化代碼塊
    {
        var2 = "吃飯睡覺打豆豆";
    }

    //構造器中初始化
    public FinalInstanceTest(){
        this.var3 = 3.14;
    }
}

可是本質上final實例變量的初始化都是在構造器中進行的。
    5. final修飾的類變量也必須在定義時或靜態初始化塊中顯式初始化,而本質上都是在靜態初始化塊中進行的。

       咱們着重看如下final修飾的字符串,小夥伴們判斷一下下面程序的輸出結果 java

public static void main(String[] args) {
	String str1 = "javacode";
	String str2 = "java" + "code";
	System.out.println(str1 == str2);  ------------------A

	String str3 = "java";
	String str4 = "code";
	String str5 = str3 + str4;
	System.out.println(str1 == str5);  ------------------B
}



        先公佈結果:A 處代碼會輸出true 而B處代碼會輸出false。
        先來研究下A處代碼。有人會說明明是兩個String對象怎麼會輸出true呢?java存在一個java字符串緩衝池,他會緩存全部使用過的字符串直接量。str1 = "javacode" 這裏便會緩存javacode這個字符串對象,而str2 = "java" + "code";能夠在編譯時肯定str2爲"javacode"因此係統自動將str2指向字符串緩存的"javacode"。因此str1和 str2指向同一個字符串對象。而B處的代碼,str5不能再編譯時肯定,系統就不會將str5指向緩存池中的"javacode",結果也就會輸出false。
        那麼什麼是編譯時肯定呢?我理解爲變量的賦值中不訪問普通變量,不調用方法,只是基本的算術運算表達式或字符串鏈接運算,這樣的變量可以被系統編譯時肯定。顯然上述代碼中str一、str2符合,而str5不符合。
如何將B處也輸出true 呢?咱們用到了final關鍵字。
        修改代碼以下
public static void main(String[] args) {
	String str1 = "javacode";
	String str2 = "java" + "code";
	System.out.println(str1 == str2);  ------------------A

	final String str3 = "java";
	final String str4 = "code";
	String str5 = str3 + str4;
	System.out.println(str1 == str5);  ------------------B
}
        這時B處將輸出true。         事實上final修飾的變量已經成爲一個直接替換量(這是我本身起的名字),當後續代碼再次用到這個變量時,系統會自動將其替換成相應的值,所以 String str5 = str3 + str4;至關於 String str5 = "java"+"code";str5也就能夠編譯時肯定了。此外相對於實例變量而言,在定義時賦初始值,非靜態初始化塊中,構造器中賦初始值都是同樣的,都將在構造器中執行,可是對於final變量只有在定義時賦初始值纔會被直接替換。         另外關於final修飾的方法,主要強調在繼承中存在的問題。被final修飾的方法子類不能重寫,並且實際上子類也沒法訪問到父類中final修飾的方法。
相關文章
相關標籤/搜索