-1

問題のクラスが他のクラスを拡張していないのに、コンストラクターが最初に呼び出され、問題のクラスが他のクラスを拡張している場合にクラス変数の初期化が行われる場合、コンストラクターが呼び出される前にクラス変数が初期化されるのはなぜですか!

たとえば、クラスがあるとしましょう

public class Windows {
    public Windows() {
        System.out.println("in window");
    }
}

私は1つの基本クラスを持っています。

public class BaseClass {
    public BaseClass() {
        System.out.println("in base");
    }
}

最後に、もう1つのクラスがあります。

public class ChildClass extends BaseClass {

Windows w = new Windows();

public ChildClass() {
    System.out.println("in subclass");

}

public static void main(String[] args) {
    System.out.println(new ChildClass());
}
}

結果として

サブクラスのウィンドウのベース

これは、基本クラスのコンストラクターが呼び出されたことを示唆しています。これは、子クラスのコンストラクターが呼び出されたことを意味しますが、基本クラスのコンストラクターが終了した後、フィールドが初期化されたのはなぜですか? つまり、次のようなものであってはなりません

ウィンドウのサブクラスのベース

それは何かを説明するでしょう!

もう一度私がする場合

public class ChildClass {

Windows w = new Windows();

public ChildClass() {
    System.out.println("in subclass");

}

public static void main(String[] args) {
    System.out.println(new ChildClass());
}
}

私は得る

サブクラスのウィンドウ内

これは、コンストラクタ ウィンドウ フィールドが初期化される前であることを示唆しています。混乱している!?!?!?いくつかの静的フィールドも追加すると、画像がさらに混乱します!

いくつかの説明は、JVMが最初にベースクラスのものを最初に初期化し、次に現在のクラスのフィールドに来て、最後にコンストラクターに来るということです。本当ですか?

いくつかの説明は素晴らしいでしょう!!

4

1 に答える 1