Должен ли вызов конструктора super()
быть самой первой строкой конструктора? Если да, то почему? Почему я не могу сделать некоторые простые ограниченные вычисления перед вызовом конструктора, например, вычисление параметров конструктора?
Я обнаружил ситуацию с конструкторами внутренних классов, которые можно вызывать с указанием замыкания:
class A {
class Inner1 {
Inner1() {
// do something
}
}
}
class B {
A a1 = new A();
A a2 = new A();
class Inner2 extends A.Inner1 {
Inner2(boolean sel) {
(sel?a1:a2).super();
}
}
}
Этот случай показывает, что мы можем захотеть выбрать объемлющий экземпляр для конструктора базового класса. Почему логика выбора должна быть такой ограниченной? Почему нельзя написать что-то подобное
if( sel ) {
a1.super();
}
else {
a2.super();
}
ДОПОЛНЕНИЕ
Под моим вопросом я подразумеваю, что ограничение может быть как в следующем случае:
public class Base {
private final String content;
public Base(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
public class Derived extends Base {
public Derived(String content) {
super(String.format("Current value of content is %s.", getContent()));
}
}
В последнем случае я:
1) Выполнение требования super()
быть в первой строке
2) Нарушение порядка строительства
3) Получите ошибку компилятора «Невозможно ссылаться на метод экземпляра при явном вызове конструктора»
Итак, почему мы не можем отменить «требование первой строки» и полагаться только на такие ошибки, как последняя?
super()
должен быть помещен в первую строку вызова конструктора, если вы его используете, но проверьте этот поток: stackoverflow.com/questions/9675431/ или это: stackoverflow.com/questions/1168345/ - person wkl   schedule 24.05.2012super()
. Java остановит вашу программу и предложит вам исправить ее. - person Hunter McMillen   schedule 24.05.2012super()
первым не решает всех проблем и создает множество новых. Однако это упрощение, потому что это означает, что нам не нужно разделять выделение объектов и инициализацию на две отдельные части. И я предполагаю, что это позволяет избежать одного вида проблем, которые в противном случае возникали бы регулярно. - person Voo   schedule 24.05.2012