作为学习的一部分,以下是我试图理解的病理学例子,
class C{}; interface I{}; class S extends C implements I{};
class B{};
通过这些声明,我可以说,class C
class B
是Object
类的直接子类,可以从这些类中访问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
类的子类。
答案 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
)(以及一些额外的编译器支持,以便能够在语法上描述并初始化一个数组)。