0

これは Java コードのスニペットです。

class A{
   public A() { }
   public A(int i) {   System.out.println(i );    }
}
class B{
   static A s1 = new A(1);
   A a = new A(2);
   public static void main(String[] args){
      B b = new B();
      A a = new A(3);
   }
   static A s2 = new A(4);
}

クラスの初期化がこのように行われたため、実行順序は次のとおりです。1、4、2、3。しかし、オブジェクトの作成を削除B b = new B();すると、クラスが上記の順序で初期化されないということでしょうか? よろしくお願いします

4

2 に答える 2

5

を削除すると、インスタンス変数として宣言されたB b = new B()参照(A a)はインスタンスで初期化されませんnew A(2)

クラスのロード時に静的変数のみがロードおよび初期化されます。インスタンス変数は、クラスをインスタンス化するときにのみ初期化されます。

理由: -

A a = new A(2);

上記のコードは次のように変換されます: -

A a;  
public B() {
    super();
    a = new A(2);
}

コンパイラによって。B()独自のコンストラクターを提供していないため、コンパイラーによって提供されるデフォルトのコンストラクターはどこにありますか。独自のコンストラクターを宣言した場合、各コンストラクターに初期化が追加されます。

したがって、Bクラスをインスタンス化しないと、初期化されないA aため、コンストラクターA(int i)は呼び出されません。

于 2012-11-07T21:26:47.230 に答える
2

main から削除すると、 1,4,3B b = new B()のみが出力されます。

クラス Bでは、初期化するためにクラスのインスタンスを必要としないため、静的とマークされたオブジェクトのみが初期化されます。クラス B が呼び出すようにします。

 A a = new A(2);

現在コードで行っているように、そのクラスのインスタンスを作成する必要があります。削除するA a= new A(2)と呼び出されないため、出力は1,4,3になります

于 2012-11-07T21:28:17.210 に答える