【问题标题】:why the compiler forbids initialization of the array? [duplicate]为什么编译器禁止初始化数组? [复制]
【发布时间】:2019-08-05 08:43:37
【问题描述】:
为什么编译器禁止初始化数组?
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]);
}
}
【问题讨论】:
标签:
java
arrays
initialization
【解决方案1】:
创建数组时需要做的事情
matrix.arr = new int[]{1,2};
【解决方案2】:
当你声明一个数组时,你可以使用语法public int[] arr = {1,2};,但是在声明之后,当你尝试在其他地方初始化它(比如在一个方法中)你不能使用你需要的简写,就像arr = new int[]{1,2};一样。
这是因为当您声明一个数组并使用一些值public int[] arr = {1,2}; 对其进行初始化时,为数组成员(在本例中为两个)分配了空间并且以后无法修改,除非您创建一个 新数组对象 并再次将其分配给该字段。数组对象的final length 属性是在您使用数组初始化器声明它时设置的。
但稍后当您执行arr = new int[]{1,2}; 时,您实际上是在创建一个新数组对象并分配 到已声明的字段。
TL;DR:
数组初始化语法 {} 仅在数组声明期间允许使用,而数组构造函数语法 new type[]{} 在赋值语句中声明后允许。