Перегрузка метода объекта/строки JAVA
Просто из любопытства я попробовал этот пример.
public class Class1 {
public void method(Object obj){
System.out.println("Object");
}
public void method(String str){
System.out.println("String");
}
public static void main(String... arg){
new Class1().method(null);
}
}
Выход будет "String". Я хочу знать, на каком основании JVM решает вызвать метод, беря String в качестве аргумента, а не Object.
Ответы
Ответ 1
Когда в список аргументов может быть применено более одного перегруженного метода, используется наиболее специфический метод.
В этом случае любой из методов можно вызывать при передаче null
, так как "нулевой тип" присваивается как Object
, так и String
. Метод, который принимает String
, более конкретный, поэтому он будет выбран.
Ответ 2
Всякий раз, когда происходит перегрузка метода, JVM будет искать метод от наиболее специфического типа до наименее определенного типа
Ответ 3
См. спецификацию JLS
15.12.2.5. Выбор наиболее конкретного метода
Это одна из загадок Java Puzzlers от Джошуа Блоха - Головоломка 46: Случай смущающего конструктора
Ответ 4
Компилятор Java выбирает наиболее специфический метод.
Строка является более конкретным типом по сравнению с Объектом.
Ответ 5
Постарайтесь передать null в метод вызова, и вы определили метод void (String str)
И String всегда инициализируется с помощью null. он найдет соответствующий метод параметризации.
То, что у вас есть "str" на консоли.
Ответ 6
Когда вы выполняете перегрузку метода, jvm пытается перейти к следующей иерархии. Напр. если вы перегружаете методы с long и int, но вызываете метод, передавая байты, он сначала переходит к int, поскольку он следующий в иерархии для байта.
Ответ 7
Это из-за метода Перегрузка
Наиболее специфический метод выбирается во время компиляции.
Как "java.lang.String" является более конкретным типом, чем "java.lang.Object". В вашем случае он возвращает String.