Я хочу вызвать только конструктор дочернего класса в многоуровневом наследовании? - PullRequest
0 голосов
/ 11 февраля 2019
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();
    }
}

При выполнении кода он вызывает весь конструктор, но должен вызывать только дочерний конструктор.

выводит как только print

Constructor C

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Как и комментарии и другой ответ, уже сказанный, это явно невозможно .

Если класс (класс 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");
        }
    }
    
0 голосов
/ 11 февраля 2019

Нет, вы не можете этого сделать.Java будет вызывать все конструкторы в соответствии с иерархией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...