根據程序上下文環境,Java關鍵字final有“這是無法改變的”或者“終態的”含義,它可以修飾非抽象類、非抽象類成員方法和變量。你可能出於兩種理解而需要阻止改變:設計或效率。
注意:父類的private成員方法是不能被子類方法覆蓋的,因此private類型的方法默認是final類型的。
final類型運用於數據:
final與static
測試案例:
public class FinalData {
private final int valueOne = 3;
private int valueTwo = 4;
private final Value v1 = new Value(4);
private Value v2 = new Value(10);
private final int[] a = {1,2,3,4,5,6,7,8,9};
private int[] b = {1,2,3,4,5,6,7,8,9};
private static final int VAL_TWO = 3;
public static void main(String[] args) {
FinalData finalData = new FinalData();
/*-----------基本類型測試------------------------------------*/
// finalData.valueOne = 4;//valueOne是常量,無法修改
finalData.valueTwo = 14;//valueTwo不是常量,可以修改
/*-----------對象類型測試------------------------------------*/
// finalData.v1 = new Value(5);//v1對象是final型常量,其引用是無法修改的。
finalData.v2 = new Value(20);//v2對象final型常量,其引用可以修改。
finalData.v1.i = 5;//v1對象的成員變量不是final型,可以修改
/*-----------數組類型測試------------------------------------*/
// finalData.a = new int[3];//數組a是final型,無法修改a的引用
finalData.b = new int[13];//數組b不是final型,可以對其引用進行修改
for(int i=0;i<finalData.a.length;i++)
finalData.a[i]++;//數組a內部數據是int型,不是final型,可以修改
/*-----------static final類型測試------------------------------------*/
// finalData.VAL_TWO = 4;
//定義為private,只能被本類的方法調用;定義為static,則強調只有一份,且只被執行一次;定義為final,則說明它是一個常量,無法被修改。
}
}
如果一個類不允許其子類覆蓋某個方法,則可以把這個方法聲明為final方法。
測試案例:
public class FinalDemo {
public void f(){
System.out.println("FianlDemo.f()");
}
public final void g(){
System.out.println("FianlDemo.g()");
}
}
繼承類
public class FinalOverriding extends FinalDemo{
public void f(){
System.out.println("FinalOverriding.f()");
}
// public void g(){//無法覆蓋父類的final方法g()
// System.out.println("FinalOverriding.g()");
// }
}
final類不能被繼承,因此final類的成員方法沒有機會被覆蓋,默認都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,並且確信這個類不會載被擴展,那麼就設計為final類。