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

Jas*_*ers 139 java arrays

我可以写:

AClass[] array = {object1, object2}
Run Code Online (Sandbox Code Playgroud)

我也可以写:

AClass[] array = new AClass[2];
...
array[0] = object1;
array[1] = object2;
Run Code Online (Sandbox Code Playgroud)

但我不能写:

AClass[] array;
...
array = {object1, object2};
Run Code Online (Sandbox Code Playgroud)

为什么这会被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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*n C 133

为什么这会被Java阻止?

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

但"为什么"是无关紧要的...限制存在,你必须忍受它.

我知道如何解决它,但有时会更简单.

你可以这样写:

AClass[] array;
...
array = new AClass[]{object1, object2};
Run Code Online (Sandbox Code Playgroud)

  • 它*会令人困惑......而且难以解析.考虑`{o1()}`是否是一个有效的表达式,`{o1();}`是一个有效的语句块.解析器必须转到'}'或';' 之前它可以区分这两种情况.语法问题根本不是微妙的! (9认同)
  • 没有新声明,语句块和数组初始化程序之间没有区别(比如javascript,这可能会产生误导) (7认同)

pro*_*ade 19

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

如果你用两个长度初始化你的数组,后来就证明你需要三个长度,你必须抛弃你所拥有的,并创建一个全新的数组.因此'new'关键字.

在前两个示例中,您将在声明时告知要分配多少内存.在第三个示例中,数组名称变为一个指向任何内容的指针,因此,在初始化时,您必须显式创建一个新数组以分配适当的内存量.

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

AClass[] array = {object1, object2}
Run Code Online (Sandbox Code Playgroud)

实际意味着

AClass[] array = new AClass[]{object1, object2};
Run Code Online (Sandbox Code Playgroud)

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

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

  • 对不起,但你试图回答"为什么"的问题并没有成功.编译器能够通过计算`{`和`}`之间的表达式来计算出数组需要多大...就像它对允许的初始化表单一样. (3认同)
  • 这是你所说的快捷方式,引用Oracle:["或者,您可以使用快捷语法来创建和初始化数组"](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays的.html).原因可能是*数组必须在内存中给出一些空间*在某些时候使用new.快捷方式中隐含了New,但快捷方式仅在声明中有效.在其他地方,没有允许的快捷方式,新的是强制性的. (2认同)

Ama*_*eet 8

我不能回答为什么部分.

但是如果你想要一些动态的东西,为什么不考虑Collection ArrayList.

ArrrayList可以是任何Object类型.

如果你想要它作为一个数组的强制,你可以使用toArray()方法.

例如:

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

我希望这对你有帮助.

  • 无需将Array的返回类型强制转换为String [].通过契约,返回的Array与指定的数组具有相同的类型.http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html#toArray(T []) (2认同)