为什么输出是"字符串".意外的输出

vin*_*hik 3 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
Run Code Online (Sandbox Code Playgroud)

我是java的初学者,我对上述程序的输出感到困惑.请解释一下输出的原因.

Sur*_*tta 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编程语言使用选择最具体方法的规则.

..... [规则]