同一類或繼承體系中,一組方法名相同、參數列表不同的方法。本質:對不同方法的統一稱呼。
存在繼承關系的父子類間,子類重新定義父類已有方法(同名、同參數、同返回類型)。本質:針對同一方法給出不同實現。
public class OverloadParent {
// 構成重載:參數類型/個數不同
public String getPerson(String name) { return "personA" + name; }
public String getPerson(int age) { return "personB"; }
public String getPerson(String name, int age) { return "personC"; }
// 編譯錯誤:僅返回值不同,不構成重載
// public void getPerson(String name) { ... }
}
public class OverloadChild extends OverloadParent {
// 繼承父類方法,可繼續重載
public void getPerson(double money) { System.out.println("重載"); }
}
原因: 調用時不指定返回類型,編譯器無法區分。
public class OverrideParent {
public void fly() { System.out.println("I can fly!"); }
}
public class OverrideChild extends OverrideParent {
@Override
public void fly() { System.out.println("I can't fly, but I can run!"); }
public static void main(String[] args) {
OverrideParent child = new OverrideChild();
child.fly(); // 輸出:I can't fly, but I can run!
}
}
@Override 註解(編譯器檢查,防止拼寫錯誤)| 維度 | 重載 | 覆寫 |
|---|---|---|
| 發生位置 | 同一類 / 父子類 | 父子類之間 |
| 方法名 | 相同 | 相同 |
| 參數列表 | 必須不同 | 必須相同 |
| 返回類型 | 可不同 | 必須相同/兼容 |
| 修飾符 | 無要求 | 子類權限 ≥ 父類 |
| 異常 | 無要求 | 子類異常 ⊆ 父類 |
| 多態類型 | 編譯期多態(靜態) | 運行期多態(動態) |
| 本質 | 不同方法同名 | 同一方法不同實現 |
println(int)/println(String)/println(Object))重載:同名參數不同,返回值不算數,編譯期綁定。 覆寫:父子同名同參,實現各不同,運行期綁定。
關注「老姜談技術」,微信號:helojava,每日一帖技術雞湯。
