为什么输出是“String”。预期之外的输出。

3
 public class Test{

public static void abc(String s) {
    System.out.println("String");

}

public static void abc(Object s) {
    System.out.println("OBject");

}

 public static void main(String[] args) {
    // TODO Auto-generated method stub
    abc(null);

}}
Output-String

我是Java的初学者,我对上面程序的输出感到困惑。请解释一下输出原因。
3个回答

8

早期绑定 (在编译时绑定最具体的方法)。

当您重载方法时,会选择最具体的方法。在这种情况下,选择顺序为String>Object(因为null可以是任何引用类型)。

在类层次结构中,String比Object更具体。因此选择了字符串。事实上,在所有Java对象中,Object是最不具体的。

这是相同内容的Java语言规范 (JLS)。

http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.5

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

..... [规则]


非常感谢您,Suresh ATTA先生。 - vinay kaushik

1
Java编译器会选择最具体的重载方法来进行选择,这被称为早期绑定。在此,String extends Object类因此更具体。您可以参考官方Java语言规范
如果有多个成员方法对于方法调用是可访问和适用的,则需要选择一个来提供运行时方法分派的描述符。Java编程语言使用最具体方法的规则来选择。

它不是在运行时完成的,而是在编译时完成的。 - Erwin Bolwidt
@ErwinBolwidt 谢谢,我已经进行了更正。 - Prasad Kharkar

0
你使用的概念是重载,Object 是 Java 中所有类的超类。因此,当你提供任何特定实现(在这种情况下是 String)以及通用实现(在这种情况下是 Object)时,JVM 默认选择特定实现。
如果你想尝试一下,请将 abc(null); 替换为 abc(123); 在这种情况下,输出将是 "OBject",因为 JVM 找不到整数的任何特定实现,所以它会选择通用实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接