Подтвердить что ты не робот

Когда отправляется конструктору в 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 ссылается на строковый массив, а не на объект?

4b9b3361

Ответ 1

Ключевым моментом здесь является то, что Object является супертипом String []

Java использует наиболее специфический доступный метод для решения таких случаев. Null может передаваться обоим методам без ошибок компиляции, поэтому Java должен найти здесь наиболее специфический метод. Версия с String [] более конкретна - поэтому она будет выбрана для выполнения.

Ответ 2

У кого-то еще был этот вопрос раньше, отметьте это сообщение

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

В другом вопросе он был String str вместо String[] s

Таким образом, поскольку String[] является более конкретным типом данных, чем его супер-тип Object, он выбирается.