4

私が持っているとしましょう

class MyObject
{
    Object object1 = new Object();
    Object object2;

    public MyObject()
    {
        object2 = new Object();
    }

    public MyObject(Object object2)
    {
        this.object2 = object2;
    }

    public MyObject(Object object1, Object object2)
    {
        this.object1 = object1;
        this.object2 = object2;
    }
}

いつobject1初期化されますか?前object2、後object2、依存?

上記の 3 番目のコンストラクタなど、のグローバル定義と競合するコンストラクタがある場合はどうなりますかobject1。どの値objectを取りますか?

これは私に問題を引き起こしているわけではありませんが、言語をもう少しよく理解したいと思っていました. これらの小さなことを知りたいので、後でそれらを利用できる可能性があります.

4

2 に答える 2

6
  • 変数は、そのタイプのデフォルト値 (0、null など) に初期化されます。

  • まず、スーパークラス コンストラクターが呼び出されます。スーパークラス コンストラクターがこのクラスでオーバーライドされた仮想メソッドを呼び出す場合、コンストラクター本体の変数初期化子または初期化に関係なく、オーバーライドには既定値が表示されます。

  • 次に、変数初期化子が実行されます。

  • 次に、コンストラクタ本体が実行されます。

したがって、コンストラクタ本体内の変数の値を変更すると、変数初期化子によって設定された値は上書きされます。(もちろん、以前の値は、他の連鎖コンストラクターなどで使用できた可能性があります。)

詳細については、JLS のセクション 12.5を参照してください。

于 2012-08-04T17:50:22.660 に答える
1

If you want to confirm behavior, use javap or a similar tool to inspect the bytecode. Though Jon is correct, refer to the specification as a first port of call.

Compiled from "MyObject.java"
class MyObject {
  java.lang.Object object1;

  java.lang.Object object2;

  public MyObject();
    Code:
       0: aload_0
       1: invokespecial #11               // Method java/lang/Object."<init>":()V
       4: aload_0
       5: new           #3                // class java/lang/Object
       8: dup
       9: invokespecial #11               // Method java/lang/Object."<init>":()V
      12: putfield      #13               // Field object1:Ljava/lang/Object;
      15: aload_0
      16: new           #3                // class java/lang/Object
      19: dup
      20: invokespecial #11               // Method java/lang/Object."<init>":()V
      23: putfield      #15               // Field object2:Ljava/lang/Object;
      26: return
于 2012-08-04T17:59:47.320 に答える