我可以写:
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 :(得分:134)
为什么这会被Java阻止?
你必须问Java设计师。这种限制可能有一些微妙的语法原因。请注意,某些数组创建/初始化结构不在Java 1.0中,并且(IIRC)在Java 1.1中添加。
但“为什么”并不重要......限制存在,你必须忍受它。
我知道如何解决这个问题,但有时会更简单。
你可以这样写:
AClass[] array;
...
array = new AClass[]{object1, object2};
答案 1 :(得分:18)
我将尝试回答为什么这样的问题:与ArrayList这样的类相比,Java数组非常简单和基本,更具动态性。 Java希望在声明时知道应该为该数组分配多少内存。 ArrayList更具动态性,它的大小可以随时间变化。
如果你用两个长度初始化你的数组,后来就证明你需要三个长度,你必须扔掉你已经得到的东西,并创建一个全新的数组。因此'new'关键字。
在前两个示例中,您将在声明时告知要分配多少内存。在第三个示例中,数组名称变为一个指向任何内容的指针,因此,在初始化时,您必须显式创建一个新数组以分配适当的内存量。
我会说(如果有人知道的话,请纠正我)第一个例子
AClass[] array = {object1, object2}
实际上意味着
AClass[] array = new AClass[]{object1, object2};
但Java设计者所做的是,如果在声明时创建数组,可以更快地编写它。
建议的解决方法很好。如果在运行时时间或内存使用情况很重要,请使用数组。如果它不重要,并且您希望代码更易于理解和使用,请使用ArrayList。
答案 2 :(得分: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]);
我希望这对你有所帮助。
答案 3 :(得分:4)
对于那些不喜欢这种骇人听闻的new AClass[] { ... }
语法的人来说,这里有一些糖:
public AClass[] c(AClass... arr) { return arr; }
根据需要使用这个小功能:
AClass[] array;
...
array = c(object1, object2);