为什么我们能够在Java中将数组分配给Object类型的引用?

时间:2014-09-22 08:42:29

标签: java arrays

作为学习的一部分,以下是我试图理解的病理学例子,

class C{}; interface I{}; class S extends C implements I{};
class B{};

通过这些声明,我可以说,class C class BObject类的直接子类,可以从这些类中访问Object类的所有方法。但是,

1)当我宣布interface I{}; interface I如何与Object课程相关时?

继续,下面是对数组类型的一些赋值,后面是子类到超类赋值和反之亦然。

C[] c = new C[4];
S[] s = new S[6];
I[] i = new S[0];
B[] b = new B[2];

//i = new C[2]; Compile error
i =s; c=s; s = (S[])c; i = (I[])c;
i = (I[])b;  //Run-time error

我了解到数组是第一类对象'和Object类的直接子类,

Object o = c;  // i mean `I i = c;` will not work `I[] i =c;` works 

2)关于上面的定义(语法),'数组的含义是第一类对象'?因为Object[] oa = c;对我有意义,因为class C是立即的Object类的子类。

1 个答案:

答案 0 :(得分:4)

  

当我声明接口I {}时;接口I如何与Object类相关?

来自Java Language Specification

  

如果接口没有直接的超接口,则接口隐式声明一个公共抽象成员方法m,其中包含签名s,返回类型r和throws子句t,对应于具有签名s的每个公共实例方法m,返回类型r和throws子句t在Object 中声明,除非接口显式声明具有相同签名,相同返回类型和兼容throws子句的方法。

  

我如何考虑指向数组c的引用变量o

如评论中所述,数组本身是Object的子类,因此以下分配有效:

Object o = c;

Java Language Specification的相关部分说:

  

在Java编程语言中,数组是对象(§4.3.1),是动态创建的,,可以分配给Object 类型的变量(§4.3。 2)。

这也是“数组是第一类对象”的含义。在Java中,数组不是特殊类型或特殊构造 - 它本质上是Object的子类,带有附加字段(特别是length)(以及一些额外的编译器支持,以便能够在语法上描述并初始化一个数组)。