【问题标题】:Which method will get invoked during overloading when null is passed [duplicate]传递null时,在重载期间将调用哪个方法[重复]
【发布时间】:2013-10-18 15:05:43
【问题描述】:

在以下程序中:

public class PolyEx1 {
    public static void main(String[] args) {
    A refA = new A();
        refA.method1(null);
    }
}

class A {
    public void method1(Object o) {
        System.out.println("o");
    }

    public void method1(String str) {
        System.out.println("str");
    }
}

输出是“str”,有人能解释一下为什么打印str吗?我无法理解这一点。

【问题讨论】:

  • 这不是多态性。超载了。

标签: java overloading


【解决方案1】:

正如 Rohit here 所解释的,

这是因为 String 类从 Object 扩展而来,因此更多 特定于对象。因此,编译器决定调用该方法。 请记住,编译器总是选择最具体的方法来调用。

如果多个成员方法既可访问又适用于 方法调用,需要选择一个来提供 运行时方法分派的描述符。 Java 编程 语言使用选择最具体方法的规则。

非正式的直觉是一种方法比 如果可以传递第一个方法处理的任何调用,则另一个 在没有编译时类型错误的情况下转到另一个。

但是,如果您有两个带参数的方法 - String 和 Integer, 那么你会得到 null 的歧义错误,因为编译器无法决定 哪个更具体,因为它们是非协变类型。

如 JLS 的 15.12.5 部分所述

【讨论】:

    【解决方案2】:

    Java 尝试使用最具体的适用版本的方法。

    String 扩展了Object,所以总是调用使用字符串作为参数的方法。

    如果您尝试添加一个采用 Integer 输入的方法,它将作为模棱两可的方法抛出错误,因为 StringInteger 两者都比 Object 更具体,但没有一个比另一个更具体

    【讨论】:

      【解决方案3】:

      public void method1(String str) 将被执行,因为对象是字符串超类,因此将调用字符串方法。

      【讨论】:

      • 太好了,为什么?这个答案对任何人都没有帮助。
      • @Tenner 我更新了解释。抱歉没有仔细阅读问题。请您重新考虑对我的回答进行评分
      猜你喜欢
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      相关资源
      最近更新 更多