1

私はJavaが初めてで、インターネットのどこかでこのコードに出くわしました。

  class FactoryOuter {

  FactoryInner[] fi = new FactoryInner[3];
  private int lastIndex = 0;
  private int x = 0;

  public FactoryOuter(int x)
  {
    this.x = x;
  }

  public int getX()
  {
    return x;
  }

  public void addInner(int y)
  {
    if (lastIndex < fi.length)
    {
      fi[lastIndex++] = new FactoryInner(y);
    }
    else throw new RuntimeException("FactoryInner array full");
  }

  public void list()
  {
    for (int i = 0; i < fi.length; i++)
    {
      System.out.print("I can see into the inner class where y = " +
                       fi[i].y + " or call display: ");
      fi[i].display();
    }
  }

  public class FactoryInner
  {
    private int y;
    private FactoryInner(int y)
    {
      this.y = y;
    }
    public void display()
    {
      System.out.println("FactoryInner x =  " + x + " and y = " + y);
    }
  }
}

public class FactoryInnerOuter
{

    public static void main(String[] args)
    {
        FactoryOuter fo = new FactoryOuter(1);
        fo.addInner(101);
        fo.addInner(102);
        fo.addInner(103);
        fo.list();
        //fo.addInner(104);
    }
}

上記のコードの出力を以下に示します

I can see into the inner class where y = 101 or call display: FactoryInner x =  1 and y = 101
I can see into the inner class where y = 102 or call display: FactoryInner x =  1 and y = 102
I can see into the inner class where y = 103 or call display: FactoryInner x =  1 and y = 103

私の質問は次のとおりです

1)FactoryInnerクラスのコンストラクターが 2 回呼び出されているのがわかります。最初のインスタンスは、以下に示すように、明らかにデフォルトのコンストラクターを呼び出します。

 FactoryInner[] fi = new FactoryInner[3];

2 番目のインスタンスは、コードで定義されているコンストラクターを呼び出します。

fi[lastIndex++] = new FactoryInner(y);

コードに 2 つのコンストラクターが必要なのはなぜですか? 交換したら

FactoryInner[] fi = new FactoryInner[3]; with

FactoryInner[] fi;

次のエラーが発生します。

Exception in thread "main" java.lang.NullPointerException
    at FactoryOuter.addInner(FactoryInnerOuter.java:19)
    at FactoryInnerOuter.main(FactoryInnerOuter.java:56)

なぜ 2 つのコンストラクターが必要なのですか? これは特に悪い例ですか?誰か説明してくれませんか。

4

2 に答える 2

2

1 つ目は、コンストラクターへの呼び出しではありません。ここでは、FactoryInner オブジェクトの配列を 3 つのオブジェクト用のスペースで初期化しています。

FactoryInner[] fi = new FactoryInner[3]; 

ここでは、実際の FactoryInner オブジェクトを配列に入れているため、クラス FactoryInner から実際にオブジェクトを初期化しているため、コンストラクターに値を与える必要があります。

fi[lastIndex++] = new FactoryInner(y);
于 2013-09-07T23:33:27.913 に答える
2

これ

fi[lastIndex++] = new FactoryInner(y);

array内のFactoryInnerindexの参照を初期化します。lastIndexFactoryInnerfi

これ

FactoryInner[] fi = new FactoryInner[3]; 

fi FactoryInner配列を初期化します。角かっこ に注意してください[]

要素を初期化する前に、まず配列を初期化する必要があります。nullそれ以外の場合は、配列参照のメンバーにアクセスしてNullPointerException.

于 2013-09-07T23:25:10.173 に答える