我知道Java中有两种初始化数组的方法
int[] a = {1,2,3};
int[] a;
a = new int[]{1,2,3};
但是为什么我不能这样使用?
int[] a;
a = {1,2,3};
构造函数中发生了什么?或者我在哪里可以找到java数组构造函数?
我找不到构造函数的详细信息
这里没有“神奇的构造函数”;相反,数组是“神奇的”,因为没有定义其行为的源文件,您也找不到例如
.length
,属性数组对象在源文件中具有。它还解释了为什么您可以使用 foo[i]
访问数组但不能使用其他东西,以及为什么 arr.length
“有效”并且是一个只读“字段”,而对于其他任何东西来说这是不可能的。
这个魔法全部在 Java Lang Spec 中定义。
具体而言,JLS §10.3 定义了如何执行此操作,并且 that 规定当且仅当您为类型为以下类型的字段或局部变量编写“初始化程序”时,您可以省略
new int[]
部分声明为数组。
之间存在零差异:
int[] a = {1, 2, 3};
和
int[] a = new int[] {1, 2, 3};
它们产生逐位相同的类文件,并且确实意味着“完全”相同的事情。当编译器遇到第一种形式时,编译器只是知道你“打算”编写第二种形式;该快捷方式被定义为仅在定义字段/局部变量时存在,而不是在为其编写赋值语句时存在,因此为什么不允许使用 a = {1, 2, 3};
。这些之间没有有意义的区别:
int[] a;
a = new int[] {1, 2, 3};
要么; AST 方面它们算作不同,但字节码方面(以及哪些代码行“运行”),差异为零。