什麼是final關鍵字
final關鍵字的表面定義就是保持變量的不可變性,使用final修飾的變量不可以改變此變量的值。
final關鍵字的使用
final修飾變量
觀察一下,final關鍵字修飾的變量必須給初始化一個值。
public final int finalVariable = 0; //final修飾的變量
public int normalVariable ; //普通變量
public static int staticVariable ; //靜態變量
final修飾變量,其變量值不可以被改變
public class FinalBase {
public final int finalVariable = 0; //final修飾的變量
public int normalVariable ; //普通變量
public static int staticVariable ; //靜態變量
public static void main(String args[]) {
FinalBase finalBase = new FinalBase() ;
finalBase.finalVariable = 1 ; //錯誤
finalBase.normalVariable = 1 ;
}
}
final修飾方法
final修飾的方法不可以被子類重寫,保持此方法的不可變性。
public class FinalBase {
public final int finalVariable = 0; //final修飾的變量
public int normalVariable ; //普通變量
public static int staticVariable ; //靜態變量
public final int finalMain() {
System.out.println(finalVariable);
return 0 ;
}
}
public class FinalBaseSon extends FinalBase{
//字類重寫父類的方法失敗,final禁止子類重寫此方法
public final int finalMain() {
return 0 ;
}
}
final修飾類
final修飾類表示此類禁止被繼承,保持類的不可變性。
public final class FinalBase {
}
//當父類FinalBase被final修飾時,則這個類不能被繼承
public class FinalBaseSon extends FinalBase{
}
final關鍵字的內存分配
final關鍵字是保證內存的指向不可變來保證它的不可變性,舉一個例子
public final class FinalBase {
public final int finalVariable = 0; //final修飾的變量
public final int finalMain() {
System.out.println(finalVariable);
return 0 ;
}
public static void main(String args[]) {
FinalBase finalBase = new FinalBase() ;
finalBase.finalVariable = 1 ; //錯誤
finalBase.finalVariable = 0 ; //錯誤
}
}
上面的final變量在被賦予相同的值的時候爲什麼還會出錯呢?
因爲final初始指向的內存地址和重新賦值指向了不同的地址,他們的值雖然是一樣的但不是同一變量。
使用場景
final關鍵字和static關鍵字通常配合使用
static 和final完全可以分開使用,並且都是各自有各自的特點。
當static和final一起使用時,可以達到一個目的:我的這個完整類不可以被你們修改,我的方法只能被你們使用。如String類。
final線程安全性:因爲final變量的不可變性,它無論同時被多少線程訪問他都是線程安全的。