2015-01-22 3 views
2
public class HelloWorld{ 
    public static void main(String []args){ 
     new SampleString().add(null); 
    } 
} 

class SampleString{ 
    public void add(Object s){ 
     System.out.println("Inside Object method"); 
    } 
    public void add(String s){ 
     System.out.println("Inside string method"); 
    } 
} 

Почему программа печатает «Метод внутри строки», а не «Метод внутри объекта»? Не могли бы вы объяснить мне логику этого?Перегрузка java-метода одним аргументом

ответ

1

Компилятор выбирает наиболее конкретную реализацию, основанную на типе аргумента, переданного методу.

Из спецификации Java Language section on determining compile-time method signature:

Если более чем один метод член является одновременно доступным и применим к вызову метода, то необходимо выбрать один, чтобы предоставить дескриптор метода времени выполнения отправки , Язык программирования Java использует правило, что выбран метод .

+2

Я подозреваю, что лучший раздел для цитаты - это на самом деле 15.12.2.5 –

+0

@JonSkeet Спасибо за исправление. Я искал этот. – manouti

+0

Спасибо @Neil Locketz manouti. Если у меня есть два класса, предположим, что A и B, которые оба расширяют C. И тогда я передаю add (A a) и добавлю (B b), а затем в основной метод вызывают add (null). Какой из них должен быть напечатан? – Sourav

0

Он выберет самый высокий уровень, который применяется. Поскольку String расширяет Object, он становится самым высоким. Если вы вызываете это с чем-то, что не является строкой, оно должно использовать объект one

+1

«Высший уровень» - не очень конкретный термин. Было бы лучше, если бы вы могли использовать ту же терминологию, что и спецификация языка. –

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