Как и комментарии и другой ответ, уже сказанный, это явно невозможно .
Если класс (класс Foo
) расширяет другой класс (класс Bar
), товсе конструкторы Foo
должны прямо или косвенно вызывать один из конструкторов Bar
.Это делается либо посредством явного, либо неявного вызова.
class Foo {
// No constructor is specified, so a default, empty constructor is generated:
// Foo() { }
}
class Bar extends Foo {
Bar() {
// Explicit call to a constructor of the super class is omitted, so a
// default one (to Foo()) is generated:
// super();
}
}
В Спецификации языка Java § 12.5 написано, как создаются новые экземпляры.Для любого класса, кроме Object
, всегда выполняется супер-конструктор.
Этот конструктор не начинается с явного вызова конструктора другого конструктора в том же классе (используя это).Если этот конструктор предназначен для класса, отличного от Object, тогда этот конструктор начнется с явного или неявного вызова конструктора суперкласса (с использованием super).Оцените аргументы и обработайте этот вызов конструктора суперкласса рекурсивно, используя те же пять шагов.Если этот вызов конструктора завершается преждевременно, то эта процедура завершается преждевременно по той же причине.В противном случае перейдите к шагу 4.
Итак, конструктор super
вызывается всегда .Если вы хотите напечатать только «Конструктор C», вам необходимо выполнить любое из следующих действий:
- Изменить конструктор
B
, чтобы он больше не печатал «Конструктор B», удалив либоprintln
оператор или полное удаление конструктора без аргументов. Добавьте в B
второй конструктор, который ничего не печатает, и вызовите его из C
:
B(boolean b) {
}
C() {
super(true);
}
Убедитесь, что C
больше не расширяется B
:
class C {
public C() {
System.out.println("Constructor C");
}
}