2017-04-11 18 views
0

私は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のリンクを共有できますか?

答えて

0

最初にサブクラスがスーパークラスから継承し、それがスーパークラスで定義されたプロパティをオーバーライドするか、またはオーバーライドすることができます。

クラスAのオブジェクトを作成するたびに、クラスがロードされているかどうかがチェックされます。クラスがロードされていない場合、スタティックなinitilizerが存在する場合はそれを呼び出し、すべての静的フィールドが初期化されます値または定義された値)。このスーパーコンストラクタが呼び出されると、スーパークラスによって設定されたすべてのプロパティが設定されます。その後、すべてのインスタンスフィールドが初期化され、最後にAのコンストラクタコードが実行されます。

以下は実行順序です。

public class A{ 
    static{ 
     // 1 
    } 
    int x = 30; // 3 
    public A(){ 
     //4 
    } 
} 

public class B extends A{ 
    static{ 
     //2 
    } 
    private int s = 60; //5 
    public B(){ 
     //6 
    } 
} 

public class Test { 
    public static void main(String[] args){ 
     new B(); 
    } 
} 
+1

私はそれを持っています、ありがとう) – DontPanic

関連する問題