Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不在声明中时的数组初始化语法_Java_Arrays - Fatal编程技术网

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

Java 不在声明中时的数组初始化语法,java,arrays,Java,Arrays,我可以写: AClass[] array = {object1, object2} 我还可以写: AClass[] array = new AClass[2]; ... array[0] = object1; array[1] = object2; 但我不会写: AClass[] array; ... array = {object1, object2}; 为什么Java会阻止它 我知道如何解决这个问题,但有时会更简单 例如: public void selectedPointsToMov

我可以写:

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;
        }
    }
}
            ArrayList<String> al = new ArrayList<String>();
            al.add("one");
            al.add("two");
            String[] strArray = (String[]) al.toArray(new String[0]);
自从我学会如何在Java中使用数组以来,这个简单的问题一直困扰着我

为什么Java会阻止它

您必须询问Java设计师。这种限制可能有一些微妙的语法原因。注意,一些数组创建/初始化构造不在Java1.0中,而(IIRC)是在Java1.1中添加的

但“为什么”并不重要。。。限制是存在的,你必须接受它

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

你可以这样写:

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

我不能回答为什么部分

<>但是如果你想要一些动态的东西,那你为什么不考虑AcLayList./P>集合? ArrrayList可以是任何对象类型

如果作为一种强制,您希望它作为一个数组,您可以对它使用toArray()方法

例如:

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;
        }
    }
}
            ArrayList<String> al = new ArrayList<String>();
            al.add("one");
            al.add("two");
            String[] strArray = (String[]) al.toArray(new String[0]);
ArrayList al=new ArrayList();
al.添加(“一”);
al.添加(“两个”);
字符串[]strArray=(字符串[])al.toArray(新字符串[0]);

我希望这可能会对您有所帮助。

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

如果你用2的长度初始化你的数组,后来发现你需要3的长度,你必须扔掉你所拥有的,然后创建一个全新的数组。因此,“新”关键字

在前两个示例中,您在声明时告诉我们要分配多少内存。在第三个示例中,数组名变成了一个完全不指向任何内容的指针,因此,当它被初始化时,您必须显式地创建一个新数组来分配适当的内存量

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

AClass[] array = {object1, object2}
实际上意味着

AClass[] array = new AClass[]{object1, object2};
但Java设计者所做的是,如果您在声明时创建数组,则可以更快地编写它


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

对于那些不喜欢这种可怕的
新AClass[]{…}
语法的人,这里有一些建议:

public AClass[] c(AClass... arr) { return arr; }
您可以随意使用此小功能:

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

W/O新声明在语句块和数组初始化器之间没有区别(例如在JavaScript中,这可能是误导)}它会混淆和难以解析。考虑“<代码> {O1())< /C> >是一个有效的表达式和<代码> {O1();}是一个有效的语句块。解析器必须先找到“}”或“;”,才能区分这两种情况。语法问题一点也不微妙!!不需要将数组的返回类型强制转换为字符串[]。根据约定,返回的数组与指定数组的类型相同。这是一个快捷方式,如您所述,引用Oracle:。原因可能是必须在某个时候使用new在内存中为数组提供一些空间。new在快捷方式中是隐式的,但该快捷方式仅在声明中有效。在其他地方,不允许使用快捷方式,new是必须的。很抱歉,您试图回答“为什么”的问题是站不住脚的。编译器将能够通过计算
{
}
之间的表达式来计算数组需要有多大,就像计算允许的初始值设定项形式一样。