class A { public int a = 3; public String show() { return "父類:a=" + a; } }
class B extends A { public int a = 5; public String show() { return "子類:a=" + a; } }
public class Test {
public static void main(String[] args) {
A a = new B();
B b = (B) a;
System.out.println(a.a); // 3
System.out.println(b.a); // 5
System.out.println(a.show()); // 子類:a=5
System.out.println(b.show()); // 子類:a=5
}
}
a,並非覆寫,而是遮蔽父類字段。編譯期靜態綁定,根據引用型別決定訪問哪個 a。
a.a:引用型別為 A,訪問父類 a=3。b.a:引用型別為 B,訪問子類 a=5。show() 為實例方法,**運行期動態分派**,根據物件實際型別(此處為 B)調用子類實現,故均輸出 子類:a=5。「變數看引用,方法看物件」。
private 封裝,提供 getter/setter,子類另行定義。@Override 註解確保方法確實覆寫,編譯器會檢查簽名一致性。