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的初学者,我对上述程序的输出感到困惑。 请解释一下输出的原因。
答案 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找不到整数的任何特定实现,所以它与泛化的一致。