【问题标题】:Why is this the program's output?为什么这是程序的输出?
【发布时间】:2013-04-10 05:27:36
【问题描述】:
public class OverloadingTest extends Format{

    public int add(String s1){
        System.out.println("With String");
        return 1;
    }
    public int add(Object a){
        System.out.println("With Object");
        return 1;
    }


    public static void main(String[] args) {
        OverloadingTest overloadingTest = new OverloadingTest();
        overloadingTest.add(null);
    }

}

为什么程序的输出是With String ?

我已经尝试阅读 JLS 的第 6 版,但我仍然找不到答案。

我能猜到的唯一原因是选择了继承层次结构中最接近的匹配项。

所以在这种情况下,它将把 String 作为 Object 是它的超类。

【问题讨论】:

  • 你回答了你自己的问题 :)
  • subber 子类总是被选中....
  • @Deepak Bala 哦,太好了。但是您有任何参考或文档可以指出这一点吗?
  • @Sam - Telthien 设法在我之前引用它。看看那个。
  • 您可以自己创建引用,只需将 public int add(Object a) 函数放在 public int add(String s1) 之前,看看这次有什么输出

标签: java overloading


【解决方案1】:

这个答案在问题Method Overloading for NULL parameter

Java 将始终尝试使用可用方法的最具体适用版本(请参阅 JLS §15.12.2)。

因此,String 被使用,因为它是最具体的可用类型。如果存在多个子类型,则必须将 null 强制转换为适当的类型以指定要运行的函数。

【讨论】:

    【解决方案2】:

    这在§15.12.2.5. Choosing the Most Specific Method中有详细说明:

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

    非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法而不会出现编译时类型错误,那么一个方法比另一个方法更具体。

    在您的示例中,add(Object) 可以处理 add(String) 可以处理的任何事情。这使得后者更具体。因此,它被选中处理null

    【讨论】:

      【解决方案3】:

      如果多个成员方法既可访问又适用于方法调用...Java 编程语言使用规则选择最具体的方法

      见The Java Language Specification

      【讨论】:

        猜你喜欢
        • 2022-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-05
        • 2021-09-29
        • 2017-01-19
        相关资源
        最近更新 更多