簡體   English   中英

Java重載-計算是否會在編譯時或運行時進行?

[英]Java Overloading - will computation happens at compile time or runtime?

下面是代碼

package org.nagark;


class baseClass{

    public void callMtd(int i){
        System.out.println("integer method"+i);
    }

    public void callMtd(double d){
        System.out.println("double method"+d);
    }
}

public class OverRidingExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        baseClass bc = new baseClass();
        bc.callMtd(10/3);
    }

}

OverRidingExample類中,我正在調用帶有參數10/3的baseClass.callMtd方法(如您在代碼中所見)。 由於callMtd在baseClass中已重載,因此默認情況下應調用哪個版本? 因為它是重載方法綁定應該在編譯時發生,但是10/3的計算是否可以在編譯時發生?

10/33相同,因此將調用int版本。

僅當不存在int參數化方法時, int才會強制轉換為double

10/3計算將在編譯時進行,因為它滿足了常量表達式的定義 (感謝holger )。

該方法及其完整簽名(包括參數類型)始終在編譯時解析。 例如,如果您使用某個jar並從此jar中的任何類調用某個方法methodName(String x) ,並且此方法更改了簽名(廣泛使用),同時將該jar用更現代的版本替換為methodName(Object x) (否問題,不是嗎?),執行將失敗。

順便說一句,如果不確定,您總是可以查看生成的OverRidingExample.class字節碼:

$ javap -c  OverRidingExample.class 
Compiled from "OverRidingExample.java"
public class org.nagark.OverRidingExample {
  public org.nagark.OverRidingExample();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class org/nagark/baseClass
       3: dup
       4: invokespecial #3                  // Method org/nagark/baseClass."<init>":()V
       7: astore_1
       8: aload_1
       9: iconst_3
      10: invokevirtual #4                  // Method org/nagark/baseClass.callMtd:(I)V
      13: return
}

您可以看到,這是:

  1. 沒有除法,只有常數的加載(我想等於3)
  2. 調用int參數化方法。 優質教育

如果您不熟悉字節碼,則可以閱讀Wiki文章。

決定調用哪種重載方法時,編譯器正在查看參數的類型。 您的類型是int 所以,方法簽名

public void callMtd(int i)

將在編譯時確定使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM