Наследование с помощью этого () - PullRequest
0 голосов
/ 24 ноября 2018

Я столкнулся с проблемой при экспериментировании с подклассами и конструкторами, и, если возможно, я хотел бы, чтобы кто-нибудь объяснил мне.

class AA {
    AA(){System.out.println("AA");}
}

class BB {
    BB() { System.out.println("BB");}
    BB(int k) { System.out.println("BB"+k);}
}

class CC extends BB {
    CC() { System.out.println("CC"); }
    CC(int k) {
        super(k);
        for (int j=0;j<5;j++) {
            System.out.print("o");
        }
    System.out.println(k);
    }
}

class DD extends CC {
    AA a3 = new AA();
    DD(int k) { super(k);}
    DD() {
        this(2);
        System.out.println("CC");
    }
}

class Program {
    public static void main(String[] a) {
        DD d = new DD();
    }
}

Это печатает

BB2
ooooo2
AA
CC

, но я могуне понимаю, почему.После того, как вызывается this (2), не должна ли программа перейти к System.out.println ("CC") и затем создать экземпляр класса AA?Похоже, что после того, как он вошел в конструктор DD (), он выполнил половину, затем создал a3 и затем вернулся, чтобы продолжить выполнение конструктора.

(я ожидал:)

BB2
ooooo2
CC
AA  

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 24 ноября 2018

Java не компилирует присваивания начальных значений полей, как вам кажется.Вы, вероятно, думаете, что начальное значение присваивается полям после вызова конструктора, но это не так.На самом деле это делается после любого super(); вызова.

Итак, вот пример:

class Foo {
    String string = "Hello";

    Foo() {
        System.out.println("Hello World");
    }
}

Вот что он будет компилировать:

class Foo {
    String string;

    Foo() {
        // First the constructor of the superclass must be called.
        // If you didn't call it explicitly, the compiler inserts it for you.
        super();

        // The next step is to assign the initial values to all fields.
        string = "Hello";

        // Then follows the user written code.
        System.out.println("Hello World");
    }
}
...