在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
short
和int
之间的模糊引用。
这是编译器不能推断你的意思是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!