Java:为什么我不能将数组声明为简单的Object?

Stu*_*ent 12 java arrays multidimensional-array

在Java中,我可以编译

Object[] obj = {new Object[1], new Object[2]};
Run Code Online (Sandbox Code Playgroud)

但我无法编译

Object obj = {new Object(), new Object()};
Run Code Online (Sandbox Code Playgroud)

在第一个例子中,我声明one-dimensional arrayObjects,并为它分配一个two-dimensional array.在第二个我宣布一个Object并为其分配一维数组.

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

Rob*_*ber 12

将数组分配给Object不是问题,但您必须像这样创建数组

Object obj = new Object[] { new Object(), new Object[2] };
Run Code Online (Sandbox Code Playgroud)

否则,编译器将不知道它是一个Object数组而不是其他类型的数组.

  • @Danyel:变量在Java中实际上从不包含数组,它总是包含对数组的引用(松散地,"指针")(与任何其他对象一样). (2认同)

T.J*_*der 9

因为Array它不仅仅是一个子类Object.数组也有语言级语义和语法.

另外,你的第二个例子引出了一个问题:对象在哪里存储你试图初始化它的那两件事?您刚刚声明了一个对象,但它没有命名字段,并且缺少数字索引的插槽数组.

你的第一个例子是编译的,因为你已经声明了一个数组Object(也就是说,对象引用),你给它初始化那个数组的元素是对象引用(对你通过创建的单元素数组的引用)new Object[1]).

这也可能有所帮助:Java并不真正具有二维数组,尽管有一些方便的语法使它看起来像它.它有(单维)阵列(单维)阵列(你得到了这个想法).