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

我可以写:

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中使用数组。

为什么这被Java阻止?

你不得不问Javadevise师。 限制可能有一些微妙的语法原因。 请注意,某些数组创build/初始化结构不在Java 1.0中,(IIRC)在Java 1.1中添加。

但“为什么”并不重要……限制在那里,你必须忍受。

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

你可以写这个:

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

我将尝试回答为什么问题:与ArrayList类相比,Java数组非常简单和简单,而且更加dynamic。 Java想要在声明时知道应该为arrays分配多less内存。 ArrayList更加dynamic,其大小随时间而变化。

如果你初始化你的数组的长度为两个,然后事实certificate你需要三个长度,你必须扔掉你有什么,并创build一个全新的数组。 因此,“新”关键字。

在前两个示例中,您将在声明时告诉分配多less内存。 在你的第三个例子中,数组名变成了一个什么也没有的指针,因此,当它被初始化时,你必须显式地创build一个新的数组来分配正确的内存量。

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

 AClass[] array = {object1, object2} 

实际上是指

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

但是Javadevise者所做的是如果在声明时创build数组,则可以更快地编写它。

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

我无法回答为什么一部分。

但是,如果你想dynamic的东西,那么你为什么不考虑Collection ArrayList。

ArrrayList可以是任何对象types。

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

例如:

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

我希望这可以帮助你。

对于那些不喜欢这个可怕的new AClass[] { ... }语法的人,这里有一些糖:

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

使用这个小函数,只要你喜欢:

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