数组初始化语法时没有在声明中

问题描述:

我可以这样写:数组初始化语法时没有在声明中

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数组播放已经缠着我简单的问题。

+0

很抱歉的文本格式,但在中国文字布局按钮不会出现一些原因:S – 2011-03-22 06:34:36

+0

代码,只要确保它缩进4个空格或更多。 – Mat 2011-03-22 06:37:12

+0

另一个问题是您粘贴的代码中有TAB字符。这弄乱了格式化。 – 2011-03-22 06:37:33

为什么这被Java*?

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

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

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

你可以这样写:

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

瓦特/ O型的新的声明会有一个语句块和数组初始化函数(如在JavaScript之间没有差异,这可能会产生误导} – bestsss 2011-03-22 07:39:18

+9

这将* *是混乱......,很难分析。试想,如果'{O1( )}'是一个有效的表达和'{O1();}'是一个有效的语句块中的解析器去的“}”或“;”才可以区分两种情况的语法问题并不微妙。在所有的程序中都可以使用!! – 2011-03-22 11:12:17

+0

您可以详细说明Java 1.0中不支持哪些数组创建语法吗? – Nayuki 2016-08-11 04:51:00

我不能回答为什么一部分。

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

ArrrayList可以是任何对象类型。

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

例如:

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

我希望这可以帮助你。

+2

不需要将数组的返回类型转换为String []。通过契约,返回的数组与指定数组的类型相同。 http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html#toArray(T []) – abc 2013-12-07 05:29:38

我会试着回答为什么问题:与ArrayList类相比,Java数组非常简单和简单,它们更具动态性。 Java想要在声明时知道应该为阵列分配多少内存。 ArrayList更具动态性,其大小可随时间而变化。

如果你初始化你的数组的长度为两个,后来证明你需要三个长度,你必须抛弃你已有的东西,并创建一个全新的数组。因此,'新'关键字。

在你的前两个例子,你跟在声明时多少内存来分配。在你的第三个例子中,数组名称根本就变成了一个什么都没有指向的指针,因此,当它初始化时,你必须显式地创建一个新的数组来分配适量的内存。

我要说的是,(如果有人知道更好,请大家指正)的第一个例子

AClass[] array = {object1, object2} 

实际上意味着

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

但Java的设计者做了什么,是使更快的方式如果您在声明时创建数组,请将其写入。

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

+1

这是一条捷径,正如你所说,引用Oracle:[“或者,你可以使用快捷方式语法来创建和初始化数组“](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html)。原因可能是*数组必须在内存中占用一些空间*在某些时候使用新数据。新内容隐含在快捷方式中,但该快捷方式仅在声明中有效。在其他地方,没有捷径允许,新的是强制性的。 – mins 2014-08-02 13:17:30

+2

对不起,您尝试回答“为什么”的问题并不成立。编译器可以通过计算'{'和'}'之间的表达式来计算出数组需要的大小,就像它允许的初始化形式一样。 – 2016-02-06 04:03:26

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

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

使用,只要你喜欢这个小功能:

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