我的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];
?
答案 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教程。