繁体   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