下面是一個很簡單的例子,關於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)同樣可以用於實現方法覆蓋,被覆蓋的方法的調用由運行期間實際對象的類型來決定;
如果需要進一步理解動態分發(dynamic dispatch),可參考如下鏈接,關於對象在內存中的分布:
http://www.programcreek.com/2011/11/what-do-java-objects-look-like-in-memory/
譯文鏈接:http://www.programcreek.com/2011/10/how-java-compiler-generate-code-for-overloaded-and-overridden-methods/