我注意到可以编写这样的代码,顺便说一句,这是完全正常的:
int arrays[] = {1, 2, 3};
for (int n : arrays)
System.out.println(n);
但我不知道以下是非法的:
for (int n : {1, 2, 3})
System.out.println(n);
从编译器编写者的角度来看,这并没有引入任何含糊之处,是吗?可以预期数组的类型与先前声明的元素的类型相同。换句话说,n
被声明为int
,因此数组必须为int[]
答案 0 :(得分:36)
您需要以下语法:
for(int n : new int[]{1, 2, 3})
System.out.println(n);
答案 1 :(得分:36)
来自Java语言规范,§10.6 - Array Initializers:
数组初始值设定项以逗号分隔的列表形式写入 用括号{和}括起来的表达式。
尾随逗号可能出现在数组中的最后一个表达式之后 初始化并被忽略。
每个变量初始值设定项必须与赋值兼容(第5.2节) 数组的组件类型,或发生编译时错误。
如果数组的组件类型是,则是编译时错误 初始化不可再生(§4.7)。
数组初始值设定项是array creation expression的一部分,它确定您需要以下四种形式之一才能成功初始化数组:
ArrayCreationExpression: new PrimitiveType DimExprs Dimsopt new ClassOrInterfaceType DimExprs Dimsopt new PrimitiveType Dims ArrayInitializer new ClassOrInterfaceType Dims ArrayInitializer
再次,从规格:
如果ClassOrInterfaceType不表示可再现类型(第4.7节),则为编译时错误。否则,ClassOrInterfaceType可以命名任何命名引用类型,甚至是抽象类类型(第8.1.1.1节)或接口类型(第9节)。
这就是您需要语法new int[] {1, 2, 3}
。
编辑:了解问题的细微差别:
从编译器编写者的角度来看,这并没有引入任何内容 含糊不清,是吗?可以预期数组的类型是 与先前声明的元素类型相同。换句话说,n是 声明为int,因此数组必须是int []
否。 是歧义。作为一个例子,以下两个陈述之间有什么区别?
int[] arr1 = new int[] {1, 2, 3};
short[] arr2 = new short[] {1, 2, 3};
主要区别在于它们在字节码中编译为什么。一个显然是一个int,另一个显然是一个短。但是,如果没有能够分辨哪个数据类型(没有数组中的值超过Short.MAX_VALUE
),那么不可能断言,这个数组超出了一个阴影怀疑,是int
。回想一下,short
属于int
的范围,因此在使用时可以轻松进入一些棘手/怪异的场景。
它变得更有趣:这是有效的代码。
for(int i : arr2) {
System.out.println(i);
}
同样,只要arr2
中的元素不超过Short.MAX_VALUE
,您就可以在short
和int
之间使用这种含糊不清的引用。
这是编译器不能仅仅推断出你的意思int
的另一个原因。您可以表示short
。*
*:并不是很多人会,但这只是为了以防做。
答案 2 :(得分:7)
因为数组是对象,所以必须实例化。 Java不会将{}本身识别为数组。但是,它确实允许您使用代码块(即{..}中的代码)来定义数组的初始元素。
上述答案描述了您完成此任务的方式。
答案 3 :(得分:0)
我认为无论何时创建变量,编译器都会自动为其分配内存。创建的内存量取决于您使用的编译器类型。在第一个语句中,您使用输入声明一个数组,编译器会自动创建数组元素的空间,但是当你在for循环中声明数组时,每次运行只创建2个字节。
对于前。
int x; // create 2 bytes of memory
无论您是否在此空间中插入值,此空间都将永久分配给int x。
int x = "123"; // This code also take 2 bytes of memory and contain value = 123
同样,
int a[] ={1,2,3} // create 6 byte of space in memory, 2 byte for each integer variable.
另一方面,当您在for循环中声明数组而不使用新标识符时,编译器会认为它是一个int变量并且只创建2个字节的内存空间而程序会出错。
for (int n : {1, 2, 3}) // create only 2 bytes of memory
因此,通过使用新标识符,我们分配一个新的内存空间并插入大括号中给出的值。
答案 4 :(得分:-1)
老实说,我在你的解释中看到的唯一谬误是你如何告诉计算机通过一个不存在的对象/内存?
你必须先创建一些东西才能通过它,在这里,你没有创造任何东西,你脑子里存在逻辑谬误,因为你的想法比Java本身的创建规则更深刻。
别担心,我发现自己处于像你这样的境地,但最重要的是要先了解Java的编程方式!