Я хочу вызвать только конструктор дочернего класса в многоуровневом наследовании?

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 супер конструктор всегда выполняется.

  1. Этот конструктор не начинается с явного вызова конструктора другого конструктора в том же классе (используя это). Если этот конструктор предназначен для класса, отличного от 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 будет вызывать все конструкторы в соответствии с иерархией.

Другие вопросы по тегам