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

Java 重載、繼承、重寫與多態核心區別深度解析

     編輯:Java 相關知識

四大概念定義

概念英文核心含義
繼承Inheritance子類獲取父類非私有成員(字段、方法),實現代碼復用與類型層級
重寫Overriding子類重新實現父類實例方法(同簽名),實現運行時多態
重載Overloading同一類中定義多個同名不同參數列表的方法,編譯時綁定
多態Polymorphism父類引用指向子類對象,調用重寫方法時執行子類實現

核心區別對比

維度繼承重寫重載多態
發生位置類之間(父子)子類中同一類中運行時對象調用
方法簽名繼承原簽名完全相同名同參不同調用重寫方法
綁定時機編譯期運行期(動態綁定)編譯期(靜態綁定)運行期
修飾符限制不可減弱訪問權限不可減弱權限、不可拋更廣異常無特殊限制依賴重寫
靜態方法可繼承但不重寫不可重寫(隱藏)可重載不適用
構造器不繼承(鏈式調用)不可重寫可重載不適用
final 方法可繼承不可重寫禁止重寫可重載不適用
private 方法不可繼承不可重寫可重載不適用

經典代碼示例

// 父類
class Shape {
    public boolean isSharp() { return true; }
    public int getSides() { return 0; }           // 被重寫
    public int getSides(Triangle t) { return 3; } // 重載
    public int getSides(Rectangle r) { return 4; } // 重載
}

// 子類:重寫
class Triangle extends Shape {
    @Override
    public int getSides() { return 3; }  // 重寫:同簽名
}

// 子類:重載(注意:這不是重寫!參數不同)
class Rectangle extends Shape {
    public int getSides(int i) { return i; }  // 重載:新簽名
}

// 測試多態
public class PolymorphismDemo {
    public static void main(String[] args) {
        Triangle tri = new Triangle();
        System.out.println("Triangle is sharp? " + tri.isSharp());  // 繼承父類方法
        
        // 多態:父類引用指向子類對象
        Shape shape = new Triangle();
        System.out.println("Sides: " + shape.getSides());  // 動態綁定:調用 Triangle.getSides() → 3
        
        // 重載:編譯期根據參數類型綁定
        Shape s2 = new Shape();
        System.out.println(s2.getSides(new Triangle()));  // 調用 Shape.getSides(Triangle) → 3
        System.out.println(s2.getSides(new Rectangle())); // 調用 Shape.getSides(Rectangle) → 4
    }
}

關鍵點解析

1. 重寫 vs 重載陷阱

class Parent {
    public void method(int i) {}
}

class Child extends Parent {
    public void method(String s) {}  // 這是重載!不是重寫
    // @Override 會報錯
}

@Override 註解能編譯期檢測此類錯誤,強烈建議加上。

2. 多態的優勢:消除重載膨脹

無多態時:父類需為每個子類提供重載方法 getSides(Triangle)、getSides(Rectangle)... 新增子類必須修改父類。

有多態時:父類只定義接口 getSides(),各子類各自重寫實現。新增子類零修改父類,符合開閉原則。

3. 網上流傳的趣味比喻

「繼承是子類使用父類的方法,多態是父類使用子類的方法。」

精準描述:父類引用(編譯時類型)調用重寫方法,實際執行子類實現(運行時類型)。

實戰最佳實踐

  1. 必加 @Override:編譯期保證重寫正確性
  2. 優先組合過繼承:除非明確 is-a 關係
  3. 設計接口而非實現:面向抽象編程,利用多態解耦
  4. 避免過度重載:參數類型相近易混淆,考慮不同方法名或參數對象
  5. 文檔化契約:重寫方法保持語義一致性(里氏替換原則)

JVM 實現機制

  • 靜態綁定:重載、私有方法、靜態方法、構造器 → 編譯期解析符號引用為直接引用
  • 動態綁定:實例方法調用(invokevirtual)→ 運行期根據對象實際類型在方法表中查找
  • 方法表:每個類有方法表,子類繼承父類表並覆蓋重寫方法槽位

總結

繼承建立類型層級,重寫實現行為差異化,重載提供同名便利,多態實現運行時動態分發。四者層層遞進:繼承是基礎,重寫是手段,多態是目的,重載是輔助。深度理解其區別、綁定時機、限制規則與設計意圖,是寫出可擴展、可維護面向對象代碼的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved