2013-10-08 4 views
9
public class Test1 { 

    public static void main(String[] args) { 
     Test1 test1 = new Test1(); 
     test1.testMethod(null); 
    } 

    public void testMethod(String s){ 
     System.out.println("Inside String Method");  
    } 

    public void testMethod(Object o){ 
     System.out.println("Inside Object Method"); 
    } 
} 

Когда я пытаюсь запустить данный код, я получаю следующий вывод:Как работают перегруженные методы?

Метод Внутри строки

Может кто-нибудь объяснить, почему метод с параметром String типа становится называется?

+1

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

+2

Возможный дубликат [странное поведение Java по умолчанию при перегрузке метода] (http://stackoverflow.com/questions/14789478/ странный-java-null-behavior-in-method-overloading) –

+0

@RohitJain этот вопрос уже является дубликатом [this] (http://stackoverflow.com/questions/1545501/which-overload-will-get-selected- for-null-in-java) – mariomario

ответ

19

наиболее специфический метод аргумент выбран для перегруженных методов

В этом случае String является подкласс Object. Следовательно, String становится более конкретным, чем Object. Следовательно, печатается Inside String method.

Непосредственно из JLS-15.12.2.5

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

Как BMT и LastFreeNickName правильно предположил, (Object)null будет вызывать перегруженный метод с Object методом типа будет вызван.

+3

Но для null, String и Object оба находятся на одинаковом уровне, то как String может быть более конкретным? –

+5

Полностью правильно! Вы можете попробовать и передать (Object) null в качестве параметра, и он выберет другой метод. – LastFreeNickname

+3

Всякий раз, когда он встречает строковый литерал в вашем коде, компилятор создает «String object» со своим значением - в этом случае - * Null *. – iMBMT

0

Добавляя к существующему ответу, я не уверен, что это из-за более новой версии Java с самого вопроса, но когда я попытался скомпилировать код с помощью метода, использующего Integer в качестве параметра вместо Object , код все еще компилировался. Однако вызов с нулевым параметром по-прежнему вызывал метод параметра String во время выполнения.

Например,

public void testMethod(int i){ 
    System.out.println("Inside int Method");  
} 

public void testMethod(String s){ 
    System.out.println("Inside String Method");  
} 

еще даст выход:

Inside String Method 

когда называют:

test1.testMethod(null); 

Основной причиной этого является то, потому что строка действительно принимает нулевое, как значение и int нет. Таким образом, null классифицируется как объект String.

Возвращаясь к заданному вопросу. Тип Объект встречается только при создании нового объекта.Это делается с помощью либо литья нуля типа как объект с помощью

test1.testMethod((Object) null); 

или с использованием любого типа объекта для примитивного типа данных, таких как

test1.testMethod((Integer) null); 
    or 
test1.testMethod((Boolean) null); 

или просто создать новый объект с помощью

test1.testMethod(new Test1()); 

следует отметить, что

test1.testMethod((String) null); 

снова вызовет метод String, так как это создаст объект типа String.

Кроме того,

test1.testMethod((int) null); 
    and 
test1.testMethod((boolean) null); 

даст компиляции ошибки времени, так как логическое и INT не принимают нулевое как допустимое значение и, как межд! = Integer и логическое! = Boolean. Целочисленный и булевский тип, передаваемый объектам типа int и boolean.

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