Каково объяснение этого 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". Зачем? почему ошибка компилятора отсутствует?
Ответы
Ответ 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 параметров (так называемой подписи аргумента) и загрузчика классов. Поскольку оба типа имеют другую сигнатуру аргумента, компилятор может легко выбрать правильный и не вызывает ошибку.