Почему мы не можем использовать this() и super() вместе в Java?
У меня есть эта программа:
public class A
{
public A(){
System.out.println("I am in A");
}
public static void main(String args[]){
B a = new B("Test");
}
}
class B extends A
{
public B(){
System.out.println("I am in B");
}
public B(String s){
this();
super();
System.out.println("I am in B as " + s);
}
}
Теперь, почему я не могу позвонить this
конструктор B
вызвать конструктор по умолчанию? Это дает мне ошибку времени компиляции.
4 ответа
this
а также super
должна быть первая строка в конструкторе.
Редакция:
Спецификация языка
8.8.7. Тело конструктора
Первое утверждение тела конструктора может быть явным вызовом другого конструктора того же класса или прямого суперкласса (§8.8.7.1).
this()
вызывает другой конструктор в том же классе.
super()
вызывает супер конструктор. Если нет super()
явно написано, компилятор добавит один неявно. Следовательно, вы в конечном итоге вызов super()
дважды.
Итак, оба не разрешены.
РЕДАКТИРОВАТЬ
В контексте вашего кода: помните, super()
всегда должна быть первой строкой в конструкторе.
После дальнейших размышлений мой ответ, как он был ниже, в основном правильный, но в нем не хватает нюансов. По сути, вы можете вызвать супер конструктор один раз. Это сделано для того, чтобы ваш суперкласс создавался только один раз. Это означает, что первая строка данного конструктора может быть вызовом другого конструктора в текущем классе или вызовом конструктора в суперклассе. Это также означает, что вы можете вызывать другой конструктор только один раз в любом данном конструкторе; Вы должны выбрать один из них в текущем или суперклассе. Это гарантирует, что все суперклассы будут полностью сконструированы до того, как будет создан текущий объект.
Старое объяснение:
Основная причина заключается в том, что все суперклассы должны быть построены до того, как подкласс может быть создан. Для этого Java будет неявно вызывать super(), если в первой строке конструктора такого вызова не существует. Единственный способ переопределить это поведение - это явно вызвать другой конструктор в вашем суперклассе. По сути, Java должна создать вашу иерархию, прежде чем вы сможете ее создать.
Помещение вашего конструктора первым нарушает это требование и поэтому является незаконным.
В соответствии с Java this() и super() должны быть первым оператором в конструкторе. Суть в том, что мы не можем записать оба сразу как первую строку. Если вы пишете this () и не super, не ожидайте, что super будет называется неявно. Это так просто, как есть. У нас нет возможности записать их вместе в одном теле конструктора