final意思爲“最終的”,所以final修飾符修飾的類、方法、變量不可改變。下面會從各個方面解析final修飾的類、方法、變量的規律。
1.final修飾成員變量
1.1成員變量
成員變量是隨類的初始化或對象初始化時就會初始化的。類初始化時系統會爲類變量分配內存、默認值;創建對象時系統會爲該對象的實例變量分配內存、默認值。
1.2 final修飾的成員變量
final修飾的成員變量必須在程序中顯式指定初始值。
final修飾的類變量必須在①靜態初始化塊中 或 ②聲明該類變量時指定初始值;
final修飾的實例變量必須在①非靜態初始化塊中、②聲明該實例變量時或③構造器中指定初始值。
1.3示例代碼
代碼如下:
public class Final_Variable {
//final修飾 實例變量 聲明時賦初值 正確
final int number = 1;
//final修飾 實例變量 非靜態初始化塊賦初始值 正確
final String name;
//非靜態初始化塊
{
name = "java";
//final修飾的number變量已經賦值,不可改變,下面一行代碼錯誤
//number = 2;
}
//final修飾 實例變量 構造器中賦初值 正確
final int n;
//構造器
public Final_Variable() {
n = 1024;
}
//final修飾 類變量 聲明時賦初值 正確
final static int a = 3;
//final修飾 類變量 靜態代碼塊中賦初值 正確
final static int b;
//靜態代碼塊
static {
b = 2019;
}
public static void main(String[] args) {
Final_Variable test = new Final_Variable();
//值不變
System.out.println(test.n);
System.out.println(test.name);
System.out.println(test.number);
System.out.println(test.a);
System.out.println(test.b);
}
}
2.final修飾局部變量
因爲系統不會對局部變量進行初始化,所以局部變量必須由程序進行顯式初始化;對局部變量進行初始化,可以在①定義時指定默認值,那麼之後就不能賦值;也可以②不指定默認值,之後只能賦值一次。
示例代碼如下:
public class Final_Variable {
public void test(final int a) {
//對形參用final修飾時,在代碼中無法賦值,下面的語句錯誤
//a = 1;
}
public static void main(String[] args) {
final int a;
//在聲明變量a時沒有賦值,那麼之後可以賦值一次
a = 1;
//下面語句錯誤,無法繼續賦值
//a = 2;
}
}
3.final變量的宏替換
如果被賦值的表達式只是基本的算術表達式或字符串連接運算,沒有訪問其他的變量、方法,那麼java編譯器會將這些變量當做“宏變量”處理,會進行宏替換。
示例代碼如下:
public class FinalReplace {
public static void main(String[] args) {
//使用final修飾,編譯時會宏替換爲“studyjava”
final String example = "study" + "java";
String a = "studyjava";
//因爲java的存儲池中不會有兩個相同的變量,所以地址相同,輸出爲true
System.out.println(example == a);
String c = "study";
String d = "java";
//沒有final修飾,調用其他的變量運算時,e的結果是由c、d兩個變量構成了,存儲地址未知
String e = c + d;
//此時輸出時爲true
System.out.println(a == e);
}
}
輸出結果爲:
true
false