当前位置: 首页 > 面试题库 >

Java中的方法重载解析

党浩阔
2023-03-14
问题内容

这是我对Java中的重载解析的了解:

编译器尝试从给定的重载方法定义中解析方法调用的过程称为重载解析。如果编译器找不到确切的匹配项,则仅通过使用向上转换来查找最接近的匹配(永远不会进行向下转换)。

这是一堂课:

public class MyTest {

    public static void main(String[] args) {
        MyTest test = new MyTest();
        Integer i = 9;
        test.TestOverLoad(i);
    }

    void TestOverLoad(int a){
        System.out.println(8);
    }

    void TestOverLoad(Object a){
        System.out.println(10);
    }

}

如预期的那样,输出为10。

但是,如果我稍微更改类定义并更改第二个重载方法。

public class MyTest {

    public static void main(String[] args) {
        MyTest test = new MyTest();
        Integer i = 9;
        test.TestOverLoad(i);
    }

    void TestOverLoad(int a){
        System.out.println(8);
    }

    void TestOverLoad(String a){
        System.out.println(10);
    }

}

输出为8。

在这里我很困惑。如果从不使用向下转换,那么为什么只打印8个?为何编译器会选择以参数为参数TestOverLoad方法,而该方法int是从Integer到的转换int


问题答案:

编译器将不考虑向下转换,而是考虑取消装箱转换以解决过载。在这里,Integer
iint成功拆箱。String未考虑此方法,因为Integer无法将扩展为String。唯一可能的过载是考虑拆箱的过载,因此8被打印出来。

第一个代码输出的原因10是,编译器将考虑将取消引用转换(Integerto Object)扩展到取消装箱转换。

JLS的15.12.2节在考虑适用哪些方法时指出:

1.
第一阶段(第15.12.2.2节)执行重载解析,不允许装箱或拆箱转换,也不允许使用可变Arity方法调用。如果在此阶段未找到适用的方法,则处理将继续进行到第二阶段。


  1. 第二阶段(第15.12.2.3节)执行重载解析,同时允许装箱和拆箱[…]


 类似资料:
  • 问题内容: 以下代码无法编译。 发出编译时错误。 对test的引用是模棱两可的,varargspkg.Main中的方法test(int …)和varargspkg.Main中的方法test(float …) 这似乎很明显,因为方法调用中的参数值可以提升为 如果任何一个或两个参数都带有或作为后缀,则会进行编译。 但是,如果我们用相应的包装器类型表示方法签名中的接收参数,如下所示 那么对该方法的调用不

  • 本文向大家介绍解析Java继承中方法的覆盖和重载,包括了解析Java继承中方法的覆盖和重载的使用技巧和注意事项,需要的朋友参考一下 方法的覆盖 在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称、返回值类型、参数列表。   如果在新类中定义一个方法,其名称、返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法。   参数列

  • Java 允许同一个类中定义多个同名方法,只要它们的形参列表不同即可。 如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,这种情况被称为方法重载(overload)。 例如,在 JDK 的 java.io.PrintStream 中定义了十多个同名的 println() 方法。 这些方法完成的功能类似,都是格式化输出。根据参数的不同来区分它们,以进行不同的格式化处理和输出。它们之

  • 我是Scala的新手。我正在编写以下代码,其中一个APIendpoint在文件中缓存值(某某JsonData.toString()),另一个endpoint从该文件中检索(Json.parse())。使用wh-thenEnter编写测试时,会出现重载方法错误。 我哪里做错了? 缓存文件内容: 缓存ontroller.scala CacheControlllerTest.scala

  • 本文向大家介绍在Java中使用方法重载,包括了在Java中使用方法重载的使用技巧和注意事项,需要的朋友参考一下 一个类可以有多个具有相同名称的方法,但方法的参数列表不应相同。这称为方法重载。方法重载有点类似于构造函数重载。 演示此的程序如下所示- 示例 输出结果 现在让我们了解上面的程序。 在方法重载的实现中,使用三种方法创建PrintValues类。其中一个采用int类型的参数,另一个采用dou

  • 本文向大家介绍简单谈谈Java中的方法和方法重载,包括了简单谈谈Java中的方法和方法重载的使用技巧和注意事项,需要的朋友参考一下 今天我们就讲一点内容,来说说Java中的方法和方法重载以及需要注意的一些地方; 方法: Java的方法类似与其他语言的函数,是一段用来完成特定功能的代码片段, 声明格式: [修饰符1 修饰符2 ....] ,返回值类型 方法名 (形式参数列表) { Java语句: -