透過實際測試發現,final 修飾的物件參考雖不能指向新物件,但物件內部屬性值卻可以改變。嘗試將 final A a 重新指向另一個 A 實例(a = b;)會導致編譯錯誤,這證明了「引用不可變,物件內容可變」。
package zy.pro.jbd.testbase;
public class A {
int t = 10;
public A() {}
public void setT(int t) { this.t = t; }
public int getT() { return this.t; }
public final void finalA() {
System.out.println(" final method finalA");
}
private void privateA() {
System.out.println("private method privateA");
}
private final void privateFinalA() {
System.out.println("private final method privateFinalA");
}
}
package zy.pro.jbd.testbase;
public class AA extends A {
public AA() {}
/*
* 錯誤嘗試:覆寫 final 方法
* public final void finalA() { ... } // 編譯錯誤
*/
private void privateA() {
System.out.println("private method privateA in class AA");
}
private final void privateFinalA() {
System.out.println("private final method privateFinalA in class AA");
}
}
子類 AA 中定義同名 private 方法完全合法,因為父類的 private 方法對子類不可見,不存在覆寫關係。
final 修飾基本類型 → 值不可變。final 修飾物件引用 → 引用不可變,物件內容可變。final 修飾方法 → 不可覆寫,可繼承;private 方法不可見,子類可同名定義。本文來自編程入門網:原文連結