Java:为什么可以';我不能将数组声明为简单对象吗?

Java:为什么可以';我不能将数组声明为简单对象吗?,java,arrays,multidimensional-array,Java,Arrays,Multidimensional Array,在Java中,我可以编译 Object[] obj = {new Object[1], new Object[2]}; 但我不能编译 Object obj = {new Object(), new Object()}; 在第一个示例中,我声明了一个对象的一维数组,并将其指定为二维数组。在第二个例子中,我声明了一个对象,并给它分配了一个一维数组 如果Java数组扩展了对象,为什么第二个代码片段不编译?为什么第一个 因为数组不仅仅是对象的子类。数组也具有相同的特性 另外,您的第二个示例回避了一个

在Java中,我可以编译

Object[] obj = {new Object[1], new Object[2]};
但我不能编译

Object obj = {new Object(), new Object()};
在第一个示例中,我声明了一个
对象的
一维数组
,并将其指定为
二维数组
。在第二个例子中,我声明了一个
对象
,并给它分配了一个一维数组


如果Java数组扩展了
对象
,为什么第二个代码片段不编译?为什么第一个

因为
数组
不仅仅是
对象
的子类。数组也具有相同的特性

另外,您的第二个示例回避了一个问题:对象将在哪里存储您试图初始化它的这两个东西?您刚刚声明了一个对象,但它没有命名字段,并且缺少数组所具有的数字索引插槽

您的第一个示例之所以编译,是因为您声明了一个
对象的数组(也就是说,对象引用),并且为初始化该数组而赋予它的元素是对象引用(通过
新对象[1]
创建的单元素数组的引用)


这可能也会有所帮助:Java并没有真正的二维数组,尽管有一些方便的语法使它看起来像是二维数组。它有(单维)数组和(单维)数组(当然……你知道了)。

将数组分配给对象不是问题,但你必须像这样创建数组

Object obj = new Object[] { new Object(), new Object[2] };
Object[] obj = {new Object(), new Object()};
否则编译器将不知道它是一个对象数组而不是其他类型的数组。

您无法编译

Object obj = {new Object(), new Object()};
因为obj不是数组,所以声明如下

Object obj = new Object[] { new Object(), new Object[2] };
Object[] obj = {new Object(), new Object()};


在下面的对话后编辑问题是,当您使用初始值设定项创建数组时,编译器需要通过对照提供的类型检查元素的类型,确保初始值设定项中的所有元素都属于相同的提供类型

也就是说,初始化数组时始终需要提供类型信息。否则,编译器不知道如何验证数组初始化是否有效,因此会出现
非法初始化错误

将数组指定给对象没有问题。例如,您可以执行以下操作:

int[] arr = {1,2};
Object obj = arr;
无法编译以下代码:

Object obj = {1,2};
因为您没有显式提供编译器验证初始值设定项中的值所需的元素类型。这是Java中数组初始化所必需的

将编译以下代码:

Object[] obj = {1,2};

因为提供了元素的类型(即,
对象
),编译器将检查
1
的类型,
2
对象的类型
(由于
整数
对象
的子类型,因此成功了)。

数组是Object的子类:@robider:我说了“不只是”。“数组不仅仅是Object的一个子类”=>但它是一个子类,你同意,所以你没有解释为什么它不起作用,事实上它确实起作用(参见Robber的回答)。“数组也有语言级语义和语法”=>含糊地引用JLS关于数组的整章只是恐吓的证据。”你刚刚声明了一个对象,但是它没有命名字段,并且缺少数组具有的数字索引插槽。“=>您没有”声明对象"; 您已经声明了Object类型的变量,该变量可以指向任何对象实例。变量从来就没有字段。@Boann:我同意Robber似乎比我更成功地关注问题的相关方面,并因此向他/她+1!最初(编辑前)的问题不太清楚,但我仍然认为Robber从中找到了答案。谢谢,你写的很多东西都很有道理@鲍恩:如果我能想出一个如此犀利的公式,你就搞定了我想回答的问题。我认为这不完全正确。我认为
objectobj={newobject(),…}
返回一个数组,就像在“多指针数组”中一样,而
new…
返回一个指向
new
后面的任何对象的指针。所以
Object obj=new Object[]{…}
返回一个指向数组的指针,而
Object obj={…}
返回一个数组。@Danyel:在Java中,变量从来都不包含数组,它总是包含指向数组的引用(松散地说,“指针”)(与任何其他对象一样)。@Crowder:是的,从技术上讲,就是这样做的,但这并不意味着内部也是这样做的?我是说,这就是为什么编译器在解释它时可能会遇到一些问题。这也只是假设,所以除非我们得到JLS的报价,否则争论是毫无意义的。(尽管……JLS是否提供了关于如何在内部实现/完成的信息?@Danyel:JLS定义了哪些变量,是的。它必须在内部以这种方式进行,否则语言的语义就会崩溃。考虑:
Object[]a;对象[]b;a=新对象[]{new Object(),new Object()};b=a;b[0]=null;System.out.println(“a[0]为null?”+(a[0]==null))
如果变量实际包含数组,则
b=a行必须是一个数组复制操作,不是吗?因此分配给
b[0]
a[0]
没有影响。但它当然是这样,因为Java定义了
a
b
保存引用是的,我知道。我并不是真的怀疑/质疑这一点。对我来说,最终的问题是,是否
对象[]o={…}
存储在应用程序的
堆栈
中。我想这就是我想要得到的。我知道最后
o
将只是一个参考,而不是实际的数组。我希望你明白我的意思。恐怕强盗的回答证明你错了。无论如何,谢谢你给我一个答案。你为什么认为我错了?你能解释一下我想知道的吗?@vamsilp:
Object
变量可以保存引用