为什么编译器禁止初始化数组?



为什么编译器禁止初始化数组?

class Matrix {
    public int[] arr = null;
}
public class Main {
    public static void main(String[] args) {
        Matrix matrix = new Matrix();
        matrix.arr = {1, 2}; // compile error
        System.out.println(matrix.arr[0]);
    }
}

当你创建一个数组时,你需要做

matrix.arr = new int[]{1,2};

当你声明一个数组时,你可以使用语法public int[] arr = {1,2};,但是在声明后,当你尝试在其他地方初始化它时(比如在方法中(,你不能使用速记你需要像arr = new int[]{1,2};一样做它。

这是因为当您声明一个数组并使用一些值初始化它时,public int[] arr = {1,2};数组成员的空间(在本例中为两个(被分配,并且以后无法修改,除非您创建新的数组对象并将其再次分配给该字段。数组对象的最终length 属性是在使用数组初始值设定项声明数组对象时设置的。

但稍后当您执行arr = new int[]{1,2};时,您实际上是在创建一个新的数组对象并分配给已声明的字段。

TL;DR:

数组初始值设定项语法{}仅在数组声明期间允许,其中数组构造函数语法new type[]{}允许在赋值语句中声明后。

最新更新