当前位置: 首页 > 知识库问答 >
问题:

Java重载-计算将发生在编译时还是运行时?

邢宏浚
2023-03-14

下面是代码

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的计算能在编译时发生吗?

共有1个答案

吕胤
2023-03-14

10/33相同,因此将调用int版本。

只有当没有int-参数化方法时,int才会被强制执行为double

10/3的计算将发生在编译时,因为它满足常量表达式的定义(谢谢,holger)。

方法及其完整签名(包括参数类型)总是在编译时解析。例如,如果您正在使用某个jar并从该jar中的任何类调用某个方法methodname(stringx),并且该方法在用更现代的版本将该jar替换为methodname(objectx)时更改签名(加宽)(没有问题,不是吗?),则执行将失败。

顺便说一句,如果您不确定,您可以查看生成的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
}

你可以看到,这里是:

    null
 类似资料:
  • 我有以下几点: 操作是在编译时还是在运行时完成的?换句话说,在运行时,上述代码段和以下代码段之间是否存在性能差异: 编辑:我的问题不同于Java编译器是否会预先计算文字的总和?,因为我在算术运算中混合使用变量和文字。虽然差别很小,但正如@TagirValeev在评论中指出的(对文本的算术运算是在编译时还是在运行时计算的?),有些情况下,某些文字没有预先编译,即使它们可能是。

  • 这两个类路径能完全不同吗?

  • 但我的问题是,如果它不使用AspectJ进行编织,那么Spring AOP是否有自己的编织,它是在加载时还是编译时执行? 我的Spring配置XML文件的相关部分是:

  • 发生在运行时,因为编译器不能在决定执行哪个函数,但为什么编译器不能在编译时决定呢? 产出: 狗在吃...

  • 问题内容: 我确实知道重载和重载之间的语法差异。而且我也知道,重载是运行时多态,重载是编译时多态。但是我的问题是:“重载真的是编译时的多态性吗?方法调用真的在编译时解决了吗?”。为了阐明我的观点,让我们考虑一个示例类。 由于所有方法都是公开的,因此可以全部重写(包括重载的方法),对吗?例如, 现在,考虑以下代码片段: 该方法返回一个随机对象。它可以返回的对象,或者它的任何子类,例如或或任何其他一个

  • 我正在学习如何通过OCA考试,并坚持这个java字符串池的概念。 考虑以下几点: 和在字符串中是相同的,在对象中也是相同的,因为它是相同的字符串文本,所以JVM在编译时将字符串池和。 现在,是在运行时计算的,因此应该返回一个新字符串。因此,应该为false,但事实并非如此。为什么? 我的一个理论是方法首先检查是否有空白需要删除,如果没有,则简单返回本身。这可以解释为什么s1==s3,但我不确定。