class A {
public String show(D obj) { return "A and D"; }
public String show(A obj) { return "A and A"; }
}
class B extends A {
public String show(B obj) { return "B and B"; } // 重載
public String show(A obj) { return "B and A"; } // 重寫
}
class C extends B {}
class D extends B {}
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a2.show(b)); // ①
System.out.println(a2.show(c)); // ②
① 輸出:B and A
② 輸出:B and A
class A {
public void MethodA() {} // 普通方法
public virtual void MethodB() {} // 虛方法 (C# 語法)
}
class B extends A {
public new void MethodA() {} // 隱藏
public override void MethodB() {} // 重寫
}
A a = new B();
a.MethodA(); // ③
a.MethodB(); // ④
③ 調用 A.MethodA
④ 調用 B.MethodB
| 特性 | 普通方法 + new (隱藏) | 虛方法 + override (重寫) |
|---|---|---|
| 綁定時機 | 編譯期靜態綁定 | 運行期動態綁定 |
| 引用類型決定 | 是 | 否 |
| 實際對象決定 | 否 | 是 |
| C# 關鍵字 | new (隱藏) | virtual/override |
| Java 對應 | 無直接對應 (默認虛方法) | 默認所有非 final/private 方法可重寫 |
abstract class E {
public void MethodA() { System.out.println("A-->MethodA"); }
public abstract void MethodB(); // 強制子類實現,類似 virtual
}
class F extends E {
@Override public void MethodA() { System.out.println("B-->MethodA"); }
@Override public void MethodB() { System.out.println("B-->MethodB"); }
}
E e = new F();
e.MethodA(); // 輸出: B-->MethodA (Java 動態分派)
e.MethodB(); // 輸出: B-->MethodB