Я хочу вызвать только конструктор дочернего класса в многоуровневом наследовании?
class A {
public A() {
System.out.println("Constructor A");
}
}
class B extends A {
public B() {
System.out.println("Constructor B");
}
}
class C extends B {
public C() {
System.out.println("Constructor C");
}
public static void main(String[] args) {
C c = new C();
}
}
При запуске кода он вызывает весь конструктор, но должен вызывать только дочерний конструктор.
вывод нравится только печать
Constructor C
2 ответа
Как и комментарии и другой ответ уже сказал, это явно невозможно.
Если класс (класс 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"); } }
Нет, ты не можешь этого сделать. Java будет вызывать все конструкторы в соответствии с иерархией.