首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 子類無法覆蓋父類靜態方法:隱藏而非多態

     編輯:Java 相關知識

「子類覆蓋父類靜態方法」是經典誤區。靜態方法屬於類而非實例,編譯期靜態綁定,**不存在多態**。子類同名靜態方法僅構成隱藏,呼叫結果取決於引用型別而非物件實際型別。

代碼驗證

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()) 造成誤讀。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved