为什么编译器禁止初始化数组?
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[]{}
允许在赋值语句中声明后。