Я думаю, вы не поняли, как Java обрабатывает конструкторы.Прежде всего, по умолчанию Java будет вызывать только один конструктор на класс, если вы явно не скажете ему вызывать more, используя this(...)
.Во-вторых, эта вызываемая конструкция является конструктором по умолчанию суперкласса (поэтому он будет вызывать super()
, а не this()
);так что класс A
на самом деле выглядит так:
public class A {
public A() {
super(); // implicit call to super(), which is Object()
System.out.println("a1");
}
public A(int x) {
super(); // implicit call to super(), which is Object()
System.out.println("a2");
}
}
Таким образом, вызов A()
будет неявно вызывать Object()
, однако вызов A(int x)
будет также неявно вызывать Object()
,а не - как вы, похоже, предполагаете - A()
.
Поскольку в B вы всегда явно указываете вызывать другой конструктор, компилятор ничего не добавит.Ниже я добавил комментарии о том, что произойдет при вызовах super(...)
и this(...)
public class B extends A {
public B() {
super(5); // explicit call to A(5), no implict call to A()
System.out.println("b1");
}
public B(int x) {
this(); // explicit call to B(), no implicit call to A()
System.out.println("b2");
}
public B(int x, int y) {
super(x); // explict call to A(x), no implicit call to A()
System.out.println("b3");
}
}
Итак, еще раз, важно помнить, что Java вставит вызов в super()
в первомстрока любого конструктора, если вы явно не вызываете другой конструктор, используя this(...)
или super(...)
.Он никогда не вставит this()
сам по себе.