在Java中的数组初始化

我注意到可以像这样写代码,这是完全正常的,顺便说一句:

int arrays[] = {1, 2, 3}; for (int n : arrays) System.out.println(n); 

但我不明白以下是非法的:

 for (int n : {1, 2, 3}) System.out.println(n); 

从编译器作者的angular度来看,这并没有引入任何含糊之处,是吗? 数组的types可以预期为与之前声明的元素相同的types。 换句话说, n被声明为int ,所以数组必须int[]

你需要这个语法:

 for(int n : new int[]{1, 2, 3}) System.out.println(n); 

从Java语言规范§10.6 – 数组初始化程序 :

数组初始值设定项被写成逗号分隔的expression式列表,用括号{和}括起来。

尾部逗号可能出现在数组初始值设定项中的最后一个expression式之后,并被忽略。

每个variables初始值设定项必须与数组的组件types分配兼容(第5.2节),否则会发生编译时错误。

如果被初始化的数组的types不可确定(§4.7),那么这是一个编译时错误。

数组初始值设定项是数组创buildexpression式的一部分 ,它定义了您需要以下四种forms之一来成功初始化数组:

 ArrayCreationExpression: new PrimitiveType DimExprs Dimsopt new ClassOrInterfaceType DimExprs Dimsopt new PrimitiveType Dims ArrayInitializer new ClassOrInterfaceType Dims ArrayInitializer 

再次,从规格:

如果ClassOrInterfaceType不表示可调整types(§4.7),则是编译时错误 。 否则,ClassOrInterfaceType可以命名任何指定的引用types,甚至是抽象类types(§8.1.1.1)或接口types(§9)。

这就是为什么你需要语法new int[] {1, 2, 3}

编辑 :为了得到更多的问题的细微差别:

从编译器作者的angular度来看,这并没有引入任何含糊之处,是吗? 数组的types可以预期为与之前声明的元素相同的types。 换句话说,n被声明为int,所以数组必须是int []

不,这是不明确的。 举个例子,以下两种说法有什么区别?

 int[] arr1 = new int[] {1, 2, 3}; short[] arr2 = new short[] {1, 2, 3}; 

主要区别在于它们在字节码中编译的内容。 一个显然是一个整数,另一个显然是短暂的。 但是,如果没有能力判断哪个数据types是哪个数据types(没有数组中的值超过Short.MAX_VALUE ),就不可能断言,这个数组超出疑问的范围是一个int 。 回想一下,一个short落入一个int的范围,所以你可以很容易地进入一些棘手的/奇怪的情况下使用。

它变得更有趣: 这是有效的代码。

 for(int i : arr2) { System.out.println(i); } 

同样,只要arr2的元素不超过Short.MAX_VALUE ,就Short.MAX_VALUE shortint之间的模糊引用。

这是编译器不能推断你的意思是int另一个原因。 你可能意思short 。*

*:并不是很多人会这样做 ,但是这只是在这样

因为数组是对象,并且必须被实例化。 Java本身不能识别数组。 但是,它确实允许您使用代码块(即{..}中的代码)来定义数组的初始元素。

上面的答案描述了你完成这个的方式。

我认为,无论何时我们创build一个variables,编译器都会自动为它分配内存。创build的内存量取决于您正在使用的编译器的types。在第一个语句中,您声明了一个包含input的数组,编译器会自动为数组元素存在于数组中,但是当您在for循环中声明数组时,它仅创build每个运行的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循环中声明数组时,编译器假定它是一个intvariables,并且只创build2个字节的内存空间,程序给出错误。

 for (int n : {1, 2, 3}) // create only 2 bytes of memory 

所以通过使用新的标识符,我们分配一个新的内存空间并插入大括号中给出的值。

说实话,我在你的解释中唯一的谬论是,你怎么能告诉计算机经历一个不存在的对象/内存?

你必须首先创build一些东西来放手,在这里,你没有创造任何东西,因为你已经想到了比Java本身的创build规则更深的逻辑谬误。

别担心,我发现自己处于像您这样的状况,但最重要的是要学习如何先编程Java!