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

Перегрузка метода объекта/строки 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.

4b9b3361

Ответ 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.