public static final String BACE_INFO = "baseinfo";首先,先明確一下,
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 }
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修飾的方法。