Abh*_*hri 13 java oop inheritance multiple-inheritance
事实1:
Java不支持多重继承.
事实2:
Object是所有其他类的超类
如果我有一个类Parent
和一个Child
继承该类的类Parent
:
class Parent {
}
class Child extends Parent {
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果Java不支持多重继承,那么类将如何Child
继承Object
该类?
这三者之间的关系是如何定义的?
选项1:
选项2:
Max*_*mer 26
它是选项2.如果你定义一个超类,那将是你班级的直接超类.如果你没有定义一个,Object
将是直接的超类.
class Parent {
}
class Child extends Parent {
}
Run Code Online (Sandbox Code Playgroud)
相当于
class Parent extends Object {
}
class Child extends Parent {
}
Run Code Online (Sandbox Code Playgroud)
因此,虽然Object
是所有类的超类,但在到达之前,类层次结构中可能会有一些步骤Object
.它不是所有类的直接超类.
Object
可能不是直接的父母,但它总是超级父母.
Child extends Parent
Parent extends Object
|
V
Child [indirectly] extends Object
Run Code Online (Sandbox Code Playgroud)
该JavaDoc的说:
Class
Object
是类层次结构的根....
如果一个类没有通过使用关键字extends
对其进行十进制来扩展任何其他类,则它会从隐式扩展中扩展Object
.
该文件说:
在没有任何其他显式超类的情况下,每个类都隐式地是Object的子类.
请参阅JLS中的示例8.1.4-1 " 直接超类和子类 " ,第8.1.4节
它表明class Point { int x, y; }
" 是Object的直接子类 "
此外,文件说:
类可以从派生自类的类派生的类派生,依此类推,最终派生自最顶层的类
Object
.据说这样一个类是继承链中所有类的后代Object
.
JLS声明它简短而正式:
子类关系是直接子类关系的传递闭包.
因此,class Object
是所有类的超类.
但文档还说:
Excepting
Object
,没有超类,每个类都有一个且只有一个直接超类(单继承).
继续这个例子,class ColoredPoint extends Point { int color; }
" 是类的直接子类Point
. " 通过传递关系,它是类的(非直接)子类Object
.
总结:
Object
要么是直接超类,要么是传递关系,是任何其他类的最后一个超类.
回答问题:
Parent
对应的类Point
和类Child
的类ColoredPoint
的JLS的例子.只有选项2显示了这种关系.那是一个有趣的讨论.我认为这将是选项2.如果你尝试下面的代码.
public static void main(String []args){
Parent p=new Parent();
Class c= p.getClass();
Child child =new Child();
Class c1= child.getClass();
System.out.println(c.getSuperclass());
System.out.println(c1.getSuperclass());
}
Run Code Online (Sandbox Code Playgroud)
您将获得输出:
class java.lang.Object
class Parent
Run Code Online (Sandbox Code Playgroud)