子類別對父類別允許存取的方法重新實作,「外殼不變,核心重寫」。回傳值與參數列表不可變。好處:子類別可定義特有行為。
class Animal { public void move() { System.out.println("動物可以移動"); } }
class Dog extends Animal { public void move() { System.out.println("狗可以跑和走"); } }
public class TestDog {
public static void main(String[] args) {
Animal a = new Animal(); a.move(); // 動物可以移動
Animal b = new Dog(); b.move(); // 狗可以跑和走(多型)
}
}
編譯期檢查參考型別(Animal 有 move),執行期依實際物件(Dog)分派。
Animal b = new Dog(); b.bark(); // 錯誤:Animal 無 bark 方法
public → 子不可 protected)final 方法不可重寫static 方法不可重寫(可重新宣告)private/final 外所有方法public/protected 非 final 方法class Dog extends Animal {
public void move() {
super.move(); // 呼叫父類版本
System.out.println("狗可以跑和走");
}
}
動物可以移動 狗可以跑和走
同一類別內方法名相同、參數列表不同(個數、型別、順序)。回傳型別可同可不同。
public class Overloading {
public int test() { System.out.println("test1"); return 1; }
public void test(int a) { System.out.println("test2"); }
public String test(int a, String s) { System.out.println("test3"); return "returntest3"; }
public String test(String s, int a) { System.out.println("test4"); return "returntest4"; }
public static void main(String[] args) {
Overloading o = new Overloading();
System.out.println(o.test());
o.test(1);
System.out.println(o.test(1,"test3"));
System.out.println(o.test("test4",1));
}
}
| 差異點 | 重載 | 重寫 |
|---|---|---|
| 參數列表 | 必須修改 | 絕不可修改 |
| 回傳型別 | 可修改 | 絕不可修改 |
| 異常 | 可修改 | 可減少/刪除,不可拋出新/更寬異常 |
| 存取權限 | 可修改 | 不可更嚴格(可放寬) |