【问题标题】:java method overloading with single argument [duplicate]带有单个参数的java方法重载[重复]
【发布时间】:2015-03-21 15:06:01
【问题描述】:
public class HelloWorld{
     public static void main(String []args){
        new SampleString().add(null);
     }
}

class SampleString{
    public void add(Object s){
        System.out.println("Inside Object method");
    }
    public void add(String s){
        System.out.println("Inside string method");
    }
}

为什么程序打印的是“Inside string method”而不是“Inside Object method”? 你能解释一下这背后的逻辑吗?

【问题讨论】:

    标签: java overloading


    【解决方案1】:

    编译器根据传递给方法的参数类型选择最具体的实现。

    来自 Java 语言规范section on determining compile-time method signature

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

    【讨论】:

    • 我怀疑引用的最佳部分实际上是 15.12.2.5
    • @JonSkeet 感谢您的更正。我一直在找那个。
    • 感谢@Neil Locketz manouti。如果我有两个类,假设 A 和 B 都扩展了 C。然后我通过 add(A a) 和 add(B b),然后在主方法中调用 add(null)。应该打印哪一个?
    • @Sourav 由于歧义,您会收到编译器错误。这也在提供的链接中进行了说明。
    • 感谢您的回答和参考链接。
    【解决方案2】:

    它将选择适用的最高级别类型。由于 String 扩展了 Object 它成为最高级别。如果你用不是字符串的东西来调用它,它应该使用 Object one

    【讨论】:

    • “最高级别”不是一个非常具体的术语。如果您可以使用与语言规范相同的术语会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多