私はJavaの初心者ではありませんが、私は混乱させた例があります。 ここにあります:初期化の厄介な順序
class A {
public A() { System.out.print("O"); }
}
class B {
{ System.out.print("A"); }
public B() { System.out.print("D"); }
}
class C {
static { System.out.print("3"); }
public C() { System.out.print("P"); }
}
public class D extends C {
private A objA = new A();
private static B objB = new B();
public D() { System.out.print("T"); }
public static void main(String[] args){
new D();
}
}
したがって、system.outの結果はどうなりますか? 静的メンバーが最初であることがわかっているので、 "3"はスーパークラスにあり、private static B objB = new B();
はインスタンスの後に初期化されます(インスタンス初期化子とコンストラクタ)。
コンソールで3AD
を取得します。
メインメソッドが実行され、クラスDの新しいインスタンスが作成されます。
しかし、このステップ以降順番は奇妙です:スーパーコンソールでpublic C() { System.out.print("P"); }
3ADP
の
コンストラクタ。
次に、D.classプライベートA objA = new A()のフィールド。
3ADPO
(コンソール)
そしてD.classのコンストラクタので、最後です:コンソールで
3ADPOT
。
質問:なぜスーパークラスのコンストラクタはサブクラスのフィールドの前に実行されますか?私はコンストラクタが最も優先度が低いと思った。誰でもdocs plzのリンクを共有できますか?
私はそれを持っています、ありがとう) – DontPanic