这个java代码有什么解释?

Moh*_*oud 16 java

我有以下代码:

public class Main {
     public void method(Object o)
     {
           System.out.println("Object Version");
     }
     public void method(String s)
     {
          System.out.println("String Version");
     }
     public static void main(String args[])
     {
           Main question = new Main();
           question.method(null);//1
     }
}
Run Code Online (Sandbox Code Playgroud)

为什么结果是"字符串版本"?如果第一个方法接受一个StringBuffer对象,为什么会出现编译器错误?
另一种情况:如果第一个方法接受一个StringBuffer对象,我写question.method("word");的结果将是"String Version".为什么?为什么没有编译器错误?

dud*_*mar 23

JAVA规范说,在这种情况下,将调用最具体的功能.由于String是Object的子类型 - 将调用第二个方法.如果将Object更改为StringBuffer - 则没有特定的方法,因为StringBuffer不是String的子类型,反之亦然.在这种情况下,编译器不知道要调用哪个方法 - 因此错误.