Когда отправляется конструктору в Java, что делает значение "null"?
Возможный дубликат:
Какой конструктор выбирается при передаче null?
Недавно я встретил это любопытство, кодируя несколько дней назад и не могу понять, почему происходит следующее:
Учитывая класс ниже
public class RandomObject{
public RandomObject(Object o){
System.out.println(1);
}
public RandomObject(String[] s){
System.out.println(2);
}
}
Когда выполняется вызов new RandomObject(null);
, вывод всегда 2
независимо от порядка, в котором были созданы конструкторы. Почему null
ссылается на строковый массив, а не на объект?
Ответы
Ответ 1
Ключевым моментом здесь является то, что Object является супертипом String []
Java использует наиболее специфический доступный метод для решения таких случаев. Null может передаваться обоим методам без ошибок компиляции, поэтому Java должен найти здесь наиболее специфический метод. Версия с String [] более конкретна - поэтому она будет выбрана для выполнения.
Ответ 2
У кого-то еще был этот вопрос раньше, отметьте это сообщение
Если есть два варианта выбора, компилятор сначала попытается выбрать более конкретный случай. В этом случае String будет выбрано над Object.
В другом вопросе он был String str
вместо String[] s
Таким образом, поскольку String[]
является более конкретным типом данных, чем его супер-тип Object
, он выбирается.