Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

четверг, 23 апреля 2009 г.

Какой конструктор будет вызван?

По мотивам Java Puzzlers #46

Дан следующий код:

public class MyClass 
{
public MyClass(Object o)
{
System.out.println("Object");
}
 
public MyClass(double[] a)
{
System.out.println("double array");
}
 
public static void main(String[] args)
{
new MyClass(null);
}
}


Вопрос: какой констуктор будет вызван в методе main?

На первый взгляд, подходят оба конструктора, так как значение null годится как для Object, так и для double[]. Один из возможных вариантов ответа: произойдет ошибка компиляции. Но это не так. Будет вызван конструктор
public MyClass(double[] a)

Почему?

В Java Language Specification (JLS) есть раздел, освещающий выбор перегруженного метода. Вызывается наиболее специфичный метод. Каждый массив в Java является Object, но не каждый Object является массивом. Конструктор MyClass(Object) принимает любой параметр, переданный конструктору MyClass(double[]). Поэтому наиболее специфичным методом (конструктором) является MyClass(double[]).
Для того, чтобы вызвать конструктор MyClass(Object) при передачи нулевой ссылки (null), следует явно привести null к типу Object:
new MyClass((Object)null);

Конечно, вместо конструкторов можно использовать паттерн фабричный метод, создав публичные статические методы, а все конструкторы объявить private.

Комментариев нет:

Отправить комментарий

Постоянные читатели