Java 内部类和两个构造函数

Java 内部类和两个构造函数,java,Java,我是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; } publi

我是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);
    }
}
我的问题如下

1) 我看到
FactoryInner
类的构造函数被调用了两次。第一个实例显然调用了一个默认构造函数,如下所示

 FactoryInner[] fi = new FactoryInner[3];
第二个实例调用代码中定义的构造函数

fi[lastIndex++] = new FactoryInner(y);
为什么代码需要两个构造函数?如果我替换

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)
为什么需要两个承包商?这是一个特别糟糕的例子吗?有人能解释一下吗。

这个

fi[lastIndex++] = new FactoryInner(y);
factorynner
数组
fi
中的索引
lastIndex
处初始化
factorynner
引用

这个

初始化
fi
FactoryInner
数组。请注意方括号,
[]

必须先初始化数组,然后才能初始化其元素。否则,您将尝试访问
null
数组引用的成员,并获取
NullPointerException

fi[lastIndex++] = new FactoryInner(y);
factorynner
数组
fi
中的索引
lastIndex
处初始化
factorynner
引用

这个

初始化
fi
FactoryInner
数组。请注意方括号,
[]


必须先初始化数组,然后才能初始化其元素。否则,您将尝试访问
null
数组引用的成员并获取
NullPointerException

第一个不是对构造函数的调用。 在这里,您正在初始化FactoryInner对象数组,其中包含三个对象:

FactoryInner[] fi = new FactoryInner[3]; 
在这里,您将实际的factoryanner对象放入数组中,因此需要为构造函数提供一个值,因为现在您实际上正在初始化factoryanner类中的对象:

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

第一个不是对构造函数的调用。 在这里,您正在初始化FactoryInner对象数组,其中包含三个对象:

FactoryInner[] fi = new FactoryInner[3]; 
在这里,您将实际的factoryanner对象放入数组中,因此需要为构造函数提供一个值,因为现在您实际上正在初始化factoryanner类中的对象:

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

可以安全地说,在java类型[]中,obj=新类型[N];所有数组的偏差是否都应该存在?@liv2hak还有另一种初始化数组的方法,使用
{…}
表示法。看一看,在java类型[]中,obj=new-Type[N];所有数组的偏差是否都应该存在?@liv2hak还有另一种初始化数组的方法,使用
{…}
表示法。看一看