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