为什么输出是" String"。意外的输出

时间:2016-10-03 06:34:03

标签: java string

 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 个答案:

答案 0 :(得分:8)

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

当您重载方法时,将选择大多数特定方法。在您的情况下,选择顺序为String> Object(因为 null 可以是任何引用类型)。

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

以下是相同的JLS

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

  

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

     

..... [规则]

答案 1 :(得分:1)

Java编译器选择最具体的重载方法将被选中。它被称为早期绑定。在这里,String extends Object类因此更具体。您可以参考official Java Language Specification

  

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

答案 2 :(得分:0)

您使用的概念是重载,Object是java中所有类的超类。因此,当您提供任何特定实现(在本例中为其String)以及一般实现(在本例中为其Object)时,JVM默认采用特定实现。 如果您想尝试一下,请将abc(null);替换为abc(123);

在这种情况下,输出将是" 对象"因为JVM找不到整数的任何特定实现,所以它与泛化的一致。