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

2022-08-31 07:44:04

我可以写:

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中玩数组以来,一直困扰着我。


答案 1

为什么这被Java阻止了?

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

但是“为什么”是无关紧要的...限制就在那里,你必须忍受它。

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

你可以这样写:

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

答案 2

我将尝试回答为什么问题:与ArrayList等更具动态性的类相比,Java数组非常简单和基本。Java 希望在声明时知道应该为数组分配多少内存。ArrayList更具动态性,其大小可能会随时间而变化。

如果你用2的长度初始化你的数组,后来发现你需要三个长度,你必须扔掉你得到的东西,并创建一个全新的数组。因此,“新”关键字。

在前两个示例中,您在声明时告诉要分配多少内存。在第三个示例中,数组名称成为指向任何值的指针,因此,当它初始化时,您必须显式创建一个新数组来分配正确的内存量。

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

AClass[] array = {object1, object2}

实际上意味着

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

但是Java设计师所做的是,如果你在声明时创建数组,就可以更快地编写它。

建议的解决方法很好。如果运行时的时间或内存使用情况至关重要,请使用数组。如果它不是关键,并且您希望代码更易于理解和使用,请使用 ArrayList。