2013-07-16 4 views
21

Просто из любопытства я попробовал этот пример.Перегрузка метода объекта/струны 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); 
    } 

} 

Выход «Строка». Я хочу знать, на какой основе JVM решает вызвать метод, беря String в качестве аргумента, а не Object.

+0

Это не ошибка компиляции? Что-то о неоднозначных параметрах? – Thilo

+0

Видимо, нет. Хотелось бы. – Thilo

+0

Ничего неопределенного в этом, @ Тило. Было бы неоднозначно, если бы первый метод принимал 'Integer' и вторую' String', так как тогда ни один из них не был бы «более конкретным», чем другой. – Joni

ответ

14

Всякий раз, когда более чем один перегруженные методы могут быть применены к списку аргументов, используется наиболее точный метод.

В этом случае любой из методов можно вызывать при передаче null, поскольку «нулевой тип» присваивается как Object, так и String. Метод, который принимает String, более конкретный, поэтому он будет выбран.

+0

как я могу назвать наименее специфический метод? –

+0

Использовать отливки типа. Например, 'method ((Object) null)' – Joni

+0

Я использую это сейчас. но позволяет сказать, что я использую этот метод как открытый метод библиотеки. поэтому я не хочу, чтобы пользователь делал все эти кастинга и все такое. пользователь просто передаст значение, и мне придется программно перенаправить элемент управления на соответствующий метод. Есть ли другой путь ? @joni –

10

Всякий раз, когда есть перегрузкой метода, виртуальная машина будет искать способа от наиболее определенного типа для наименьшего определенного типа

+2

Я предлагаю отредактировать вашу цитату из «наиболее близкого» к «самому определенному типу», было бы более уместно с точки зрения программирования языка. – exexzian

+0

Сделано исправление. Спасибо за это. Я имел в виду то же самое, однако ваши слова имеют больше смысла. – Reddy

+3

Это компилятор, который решает, какой метод следует вызывать, а не JVM. – Joni

0

Becaue вы передаете нуль в вызове метода и вы определили пустоту method (String str) И строка всегда инициализируется нулевым значением. он найдет соответствующий метод параметризации. Thats y u получил «str» на консоли.

2

Компилятор Java выбирает наиболее специфический метод.

Строка представляет собой более конкретный тип по сравнению с Object.

0

Когда вы выполняете перегрузку метода, jvm пытается перейти к следующей иерархии. Напр. если вы перегружаете методы с long и int, но вызываете метод, передавая байты, он сначала переходит к int, поскольку он следующий в иерархии для байта.

0

Это из-за перегрузкой метода

Наиболее конкретный метод выбирается во время компиляции.

Как «java.lang.String» является более конкретным типом, чем «java.lang.Object». В вашем случае он возвращает String.

Смежные вопросы