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

why the compiler forbids initialization of the array?

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

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};,但是当你试图在别处初始化它时声明之后(比如在一个方法中)你不能使用你需要做的shorthand喜欢 arr = new int[]{1,2};.

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

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

TL;DR:

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