Почему this () и super () должны быть первым оператором в конструкторе?
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
}
}
Так что, этоnot stopping you from executing logic до звонка в супер. Это просто мешает вам выполнить логику, которую вы не можете вписать в одно выражение.
Есть похожие правила для звонковthis()
, Компилятор говорит, что «вызов this должен быть первым оператором в конструкторе».
Почему компилятор имеет эти ограничения? Можете ли вы привести пример кода, где, если бы у компилятора не было этого ограничения, что-то плохое могло случиться?