事实1:
Java不支持多重继承。
事实2:
对象是所有其他类的超类
如果我有一个类Parent
和一个类Child
,它继承了类Parent
:
class Parent {
}
class Child extends Parent {
}
在这种情况下,如果Java不支持多重继承,类Child
将如何继承Object
类?
这三个之间的关系如何定义?
选项1:
选项2:
答案 0 :(得分:25)
这是选项2。如果定义超类,则它将是您的类的直接超类。如果您未定义一个,则Object
将是直接超类。
class Parent {
}
class Child extends Parent {
}
等同于
class Parent extends Object {
}
class Child extends Parent {
}
因此,尽管Object
是所有类的超类,但在进入Object
之前,类层次结构中可能会有一些步骤。它不是所有类的直接超类。
答案 1 :(得分:8)
Object
可能不是直接父母,但始终是超级父母。
Child extends Parent
Parent extends Object
|
V
Child [indirectly] extends Object
答案 2 :(得分:6)
JavaDoc说:
类
Object
是类层次结构的根。 ...
如果某个类没有通过使用关键字extends
进行除垢来扩展任何其他类,则它会扩展,但从Object
隐式扩展。
中的JLS, chapter 8.1.4“ 直接超类和子类”在没有任何其他显式超类的情况下,每个类都是 隐式地是Object的子类。
它表明class Point { int x, y; }
“ 是对象的直接子类”
此外,文档说:
类可以从以下类派生而来: 是从类等派生的,并最终从 最高级的课程,
Object
。据说这样的阶级是所有人的后代 继承链中的类可以追溯到Object
。
JLS声明它简短而正式:
子类关系是直接关系的传递闭包 子类关系。
因此,类Object
是所有类的超类。
但是文档中还说:
除了
Object
(没有超类)外,每个类都有一个且只有一个直接超类(单个 继承)。
以示例class ColoredPoint extends Point { int color; }
继续,“ 是类Point
的直接子类。”。通过传递关系,它是类Object
的(非直接)子类。
摘要:
Object
是直接超类,或者通过传递关系是任何其他类的最后一个超类。
回答问题:
Parent
对应于JLS的类Point
,类Child
对应于JLS的类ColoredPoint
例。仅选项2 显示此关系。答案 3 :(得分:5)
这是一个有趣的讨论。我认为这将是第二种选择。就像您尝试下面的代码一样。
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());
}
您将得到的输出为:
class java.lang.Object
class Parent
答案 4 :(得分:3)
选项2,因为每个对象都派生Object.class方法
答案 5 :(得分:3)
正确的答案是选项2。任何Java类都为其父级继承所有父级。换句话说。
A级扩展了B级 B级延伸到C级 C类扩展了D类
X类扩展了A->,这意味着A继承了B,C和D的所有受保护/打包/公共字段。
在您的示例中,子类在传递模式下继承了父级属性,但也继承了对象属性。
答案 6 :(得分:3)
public class Object
类对象是类层次结构的根。
每个类都将Object作为超类。
所有对象(包括数组)都将实现此类的方法。
这意味着每个Java类在层次结构中都以Object
作为根,而不一定是其直接父级。
答案 7 :(得分:3)
在Java中,没有多重继承意味着一个类只能扩展1个类。有一个直接基类。间接地,一个类可以有许多祖先:Child具有Parent和Object作为祖先的“ super”类。
Object --> Parent --> Child
--> OtherChild
Relation: 1 --> N
像C ++中那样避免多重继承的原因是涉及的歧义:
假设多重继承的伪代码:
class A : Comparable
class B : Comparable
class Child : A, B {
@Override A? B?
int compareTo(Child rhs) { ... super.compareTo ? ... }
}
A a = new Child();
B b = new Child();
a.compareTo(b);
答案 8 :(得分:3)
首先,使用Java 8,有可能完成Multiple inheritance using Default methods of interfaces。
第二,在“选项2”中正确表示了您对Object类的理解。
但是,它不是多重继承,而是多层继承。 “选项1”是多重继承。
请选中此link,以详细了解它们。
答案 9 :(得分:2)
选项2.Object是所有其他类的超类,但Object可能不是类的直接超类。