Подтвердить что ты не робот

Каково объяснение этого 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
     }
}

Почему в результате получается "String Version"? и почему возникает ошибка компилятора, если первый метод принимает объект StringBuffer?
Другой случай: если первый метод принимает объект StringBuffer, и я пишу question.method("word");, результатом будет "String Version". Зачем? почему ошибка компилятора отсутствует?

4b9b3361

Ответ 1

Спецификация JAVA говорит, что в таких случаях будет вызвана самая конкретная функция. Поскольку String является подтипом объекта - будет вызван второй метод. Если вы измените Object на StringBuffer - нет специального метода, поскольку StringBuffer не является подтипом String и наоборот. В этом случае компилятор не знает, какой метод вызывать - следовательно, ошибка.

Ответ 2

При взгляде на другой случай:

пакет com.snamellit;

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("word");
    }
}

Если первый метод tqkes содержит StringBuffer, а второй - String, нет никакой путаницы, поскольку "word" - это String, а не StringBuffer.

В Java идентификатор функции/метода зависит от трех вещей: имени, типа pf параметров (так называемой подписи аргумента) и загрузчика классов. Поскольку оба типа имеют другую сигнатуру аргумента, компилятор может легко выбрать правильный и не вызывает ошибку.