Java初始化一个int数组,构造函数中发生了什么

问题描述 投票:0回答:1

我知道Java中有两种初始化数组的方法

int[] a = {1,2,3};
int[] a;
a = new int[]{1,2,3};

但是为什么我不能这样使用?

int[] a;
a = {1,2,3};

构造函数中发生了什么?或者我在哪里可以找到java数组构造函数?

我找不到构造函数的详细信息

java arrays constructor
1个回答
0
投票

这里没有“神奇的构造函数”;相反,数组是“神奇的”,因为没有定义其行为的源文件,您也找不到例如

.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 方面它们算作不同,但字节码方面(以及哪些代码行“运行”),差异为零。

© www.soinside.com 2019 - 2024. All rights reserved.