Как работают перегруженные методы?

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 параметр типа вызывается?

2 ответа

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

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

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

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

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

Добавляя к уже существующему ответу, я не уверен, что это из-за более новой версии 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);

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

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

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);

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

Другие вопросы по тегам