程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 【Simple Java】Java編譯器如何生成重載和覆蓋方法代碼,simple編譯器

【Simple Java】Java編譯器如何生成重載和覆蓋方法代碼,simple編譯器

編輯:JAVA綜合教程

【Simple Java】Java編譯器如何生成重載和覆蓋方法代碼,simple編譯器


下面是一個很簡單的例子,關於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/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved