「子類覆蓋父類靜態方法」是經典誤區。靜態方法屬於類而非實例,編譯期靜態綁定,**不存在多態**。子類同名靜態方法僅構成隱藏,呼叫結果取決於引用型別而非物件實際型別。
class A {
public static String s = "父類靜態";
public static void prints() { System.out.println(s); }
public void show() { System.out.println("show " + s); }
}
class B extends A {
public static String s = "子類靜態"; // 隱藏父類欄位
public static void prints() { System.out.println("子類 " + s); } // 隱藏父類方法
public void show() { System.out.println("子類 show " + s); } // 真正覆寫實例方法
}
public class StaticHideDemo {
public static void main(String[] args) {
A a = new A(); a.prints(); a.show(); // 父類靜態 / show父類靜態
B b = new B(); b.prints(); b.show(); // 子類靜態 / 子類show子類靜態
A c = new B(); c.prints(); c.show(); // 父類靜態 / 子類show子類靜態 ← 關鍵行
}
}
父類靜態
show父類靜態
子類靜態
子類show子類靜態
父類靜態 ← c.prints() 靜態綁定看引用型別 A
子類show子類靜態 ← c.show() 動態綁定看物件型別 B
A.prints()),避免用實例引用 (a.prints()) 造成誤讀。