Как работают перегруженные методы?
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 и логическим.