不在声明中时的数组初始化语法

我可以写:

AClass[] array = {object1, object2}

我还可以写:

AClass[] array = new AClass[2];
...
array[0] = object1;
array[1] = object2;

但我不能写:

AClass[] array;
...
array = {object1, object2};

为什么这个被 Java 阻止了?

我知道如何解决这个问题,但是有时候会更简单一些。

例如:

public void selectedPointsToMove(cpVect coord) {


if (tab == null) {
if (arePointsClose(coord, point1, 10)) {
cpVect[] tempTab = {point1};
tab = tempTab;
} else if (arePointsClose(point2, coord, 10)) {
cpVect[] tempTab = {point2};
tab = tempTab;
} else {
cpVect[] tempTab = {point1,point2};
tab = tempTab;
}
}
}

这个简单的问题一直困扰着我,因为我学会了如何在 Java 中使用数组。

264798 次浏览

为什么这个被 Java 阻止了?

你得去问 Java 设计师。这种限制可能有一些微妙的语法原因。注意,一些数组创建/初始化构造不在 Java 1.0中,而且(IIRC)是在 Java 1.1中添加的。

但是“为什么”是无关紧要的... 限制是存在的,你必须接受它。

我知道如何解决这个问题,但是有时候会更简单一些。

你可以这样写:

AClass[] array;
...
array = new AClass[]{object1, object2};

我不知道为什么。

但是,如果你想要一些动态的东西,那么为什么不考虑收集数组列表。

ArrrayList 可以是任何 Object 类型。

如果作为一种强制,您希望它作为一个数组,那么您可以对它使用 toArray ()方法。

例如:

            ArrayList<String> al = new ArrayList<String>();
al.add("one");
al.add("two");
String[] strArray = (String[]) al.toArray(new String[0]);

我希望这能帮到你。

我将尝试回答这个为什么的问题: 与 ArrayList 这样的更动态的类相比,Java 数组非常简单和基本。Java 希望在声明时知道应该为数组分配多少内存。数组列表更加动态,它的大小可以随着时间的推移而变化。

如果你初始化的数组长度是2后来发现你需要一个3的长度你必须抛弃已有的东西创建一个全新的数组。因此,’新’关键字。

在前两个示例中,您在声明时告诉要分配多少内存。在第三个示例中,数组名称变成了一个空指针,因此,在初始化它时,必须显式创建一个新数组来分配合适的内存量。

我会说(如果有人知道更好,请纠正我)第一个例子

AClass[] array = {object1, object2}

实际上

AClass[] array = new AClass[]{object1, object2};

但 Java 设计人员所做的是,如果在声明时创建数组,就能以更快的方式编写它。

建议的变通方法是好的。如果在运行时时间或内存使用是关键的,则使用数组。如果它不是关键的,并且您希望代码更容易理解和使用,那么可以使用 ArrayList。

对于那些不喜欢这种可怕的 new AClass[] { ... }语法的人来说,这里有些甜头:

public AClass[] c(AClass... arr) { return arr; }

你可以随意使用这个小函数:

AClass[] array;
...
array = c(object1, object2);