2016-10-03 59 views
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中,我很困惑上面的程序的输出。 请解释我输出的原因。为什么输出是“字符串”。意外的输出

回答

1

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

如果不止一个成员方法既方便和适用于方法调用,就必须选择一个提供运行时方法调度描述符。 Java编程语言使用选择最具体方法的规则。

+0

这不是在运行时完成的,而是在编译时 –

+0

@ErwinBolwidt谢谢,我已经做了更正。 –

8

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

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

在层次结构中,String比Object更具体。因此,字符串被选中。事实上对象是在所有的Java中的至少特定对象

这里是JLS为同一

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

如果不止一个成员方法既方便和适用于方法调用,有必要选择一个为运行时方法调度提供描述符。 Java编程语言使用选择最具体方法的规则。

..... [规定]

+0

非常感谢先生。 @suresh ATTA –

0

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

在这种情况下更换abc(null);,输出将是“对象”为JVM找不到任何整数具体实施如此这般广义之一。