Java требует, чтобы, если вы вызываете this() или super() в конструкторе, это должно быть первое утверждение. Почему?
Например:
public class MyClass {
public MyClass(int x) {}
}
public class MySubClass extends MyClass {
public MySubClass(int a, int b) {
int c = a + b;
super(c); // COMPILE ERROR
}
}
Компилятор Sun говорит, что "вызов super должен быть первым выражением в конструкторе". Компилятор Eclipse говорит, что "вызов конструктора должен быть первым оператором в конструкторе".
Однако вы можете обойти это, немного изменив код:
public class MySubClass extends MyClass {
public MySubClass(int a, int b) {
super(a + b); // OK
}
}
Вот еще один пример:
public class MyClass {
public MyClass(List list) {}
}
public class MySubClassA extends MyClass {
public MySubClassA(Object item) {
// Create a list that contains the item, and pass the list to super
List list = new ArrayList();
list.add(item);
super(list); // COMPILE ERROR
}
}
public class MySubClassB extends MyClass {
public MySubClassB(Object item) {
// Create a list that contains the item, and pass the list to super
super(Arrays.asList(new Object[] { item })); // OK
}
}
Таким образом, не останавливает вас от выполнения логики перед вызовом super. Это просто останавливает вас от выполнения логики, которую вы не можете вместить в одно выражение.
Существуют аналогичные правила для вызова this()
. Компилятор говорит, что "вызов этого должен быть первым выражением в конструкторе".
Почему у компилятора эти ограничения? Можете ли вы привести пример кода, где, если у компилятора не было этого ограничения, произойдет что-то плохое?