最终静态变量的初始化

时间:2016-06-17 02:27:27

标签: java static final

我的Java文件中有这样的代码:

private ClassA() {}
private static final ClassA groupA[] = new ClassA[5];


public ClassA getInstance() {
    return groupA[2];
}

我是否需要显式调用构造函数来创建单个实例,还是自动调用默认构造函数?

如果此代码除了为5个引用分配空间并将它们初始化为null之外什么都不做,为什么以下代码段无效 - private static final ClassA groupA[5];

4 个答案:

答案 0 :(得分:2)

  

我是否需要显式调用构造函数来创建单个实例,还是自动调用默认构造函数?

你需要调用(使用new!)构造函数5次; e.g。

private static final ClassA groupA[] = new ClassA[] {
    new ClassA(), new ClassA(), new ClassA(), new ClassA(), new ClassA()};

private static final ClassA groupA[] = new ClassA[5];

static {  // NB: this is a static initializer block!
    for (int i = 0; i < groupA.length; i++) {
        groupA[i] = new ClassA();
    }
}
  

如果此代码除了为5个引用分配空间并将它们初始化为null之外什么都不做,

......它是......

  

为什么以下一段代码无效?

private static final ClassA groupA[5];

上面的代码甚至没有创建数组。并且由于它没有这样做并且(可能)您没有static初始化程序块降低,static无法初始化。这让它变得毫无用处。

第二个问题是上面的代码在语法上是无效的。您不能在Java中的数组声明中包含大小。只能在数组初始化中指定大小。

以上是上述语法上有效的版本:

private static final ClassA groupA[];

或更好

private static final ClassA[] groupA;

这两种形式意味着相同的东西,但Java风格指南说使用旧的类C语法并不好。请注意,我们仍然有初始化数组来处理的问题。

答案 1 :(得分:0)

也许是因为您没有为ClassA的每次初始化使用'new'关键字。你只是初始化一个数组来保存它们。

答案 2 :(得分:0)

  

我是否需要显式调用构造函数来创建单个实例

是的,因为你所做的一切都是一个零数组。

  

为什么以下一段代码无效 - 私有静态最终ClassA groupA [5];

这段代码在语法上不正确,因为对象的类型是一个数组,因此大小不是声明的一部分。在数组的初始化中,5位于等于的右侧。

答案 3 :(得分:0)

创建一个包含5个元素(groupA [0],groupA [1],.. groupA [4])的数组groupA,每个插槽存储一个classA实例,你会这样做:

ClassA[] groupA = new ClassA[5]; 

Array无法调整大小,因此实际上ArrayList更灵活。 列表提供了更多的灵活性。

List<classA> groupList = List<classA>(); //Without inference

List<classA> groupList = List<>(); //With inference (Java 8)

现在需要向数组中添加元素:

groupA[4] = generateClassA(); //adds instance of classA to fifth element of array.

groupList.add(generateClassA()); //将第一个元素添加到列表

在YouTube上查看Derek Banas Java教程 - 他有最好的Java教程。