下面是一個很簡單的例子,關於Java中的多態:方法重載和方法覆蓋;
多態指的是方法在不同的時刻表現出不同的形式;在編譯期間,這被叫做方法重載;方法重載允許相關的方法被同一個方法名字調用,這有時候被叫做ad-hoc polymorphism;
package simplejava;
class A {
public void M(int i) {
System.out.println("int");
}
public void M(String s) {
// this is an overloading method
System.out.println("string");
}
}
class B extends A {
public void M(int i) {
// this is overriding method
System.out.println("overriden int");
}
}
public class Q13 {
public static void main(String[] args) {
A a = new A();
a.M(1);
a.M("abc");
A b = new B();
b.M(1234);
}
}
那麼對於編譯器來說,如何生成方法代碼以便能被正確調用呢?
靜態重載的實現並不難,當處理重載方法聲明的時候,將他們綁定到不同的實現,在類型檢查的時候,編譯器分析參數類型來決定哪個方法被調用;
動態重載允許在運行期間根據實際參數類型來選擇不同的方法實現,這是動態分發(dynamic dispatch)的一種形式;
動態分發(dynamic dispatch)同樣可以用於實現方法覆蓋,被覆蓋的方法的調用由運行期間實際對象的類型來決定;