Java中的每个子类都继承自两个类(Object及其超类)?

时间:2016-11-28 17:45:42

标签: java oop inheritance multiple-inheritance

当我创建一个新类时,它是

ClassA extends Object{
}

所以,如果我要从ClassB继承ClassA,那就不是

ClassA extends Object extends ClassB {
}

基本上是Java中不允许的多重继承。

或者Object类是否有一个特殊的例外,这意味着确实可以安全地说, Java中的每个基类都是从2个类继承

2 个答案:

答案 0 :(得分:8)

没有

ClassA继承自ClassB继承自Class。

这不是多重继承。这是单继承。单继承为您提供了一种链:

Object -> ClassB -> ClassA

多重继承可以让你做更多的树:

Object -> ClassB \
                  ---> ClassA
Object -> ClassC /

Java不允许你做后者。最接近的是实现多个接口。

请注意,这仍然可以(单继承),因为每个类最多只有一个直接基数:

                  /--> ClassC
Object -> ClassB -
                  \--> ClassD

另外,要回答你的直接问题,JLS 8.1.4 states(强调我的):

  

给定...类声明...类类型C的直接超类是如果存在extends子句则在C声明的extends子句中给出的类型,否则为Object

也就是说,它仍然是单一的继承。如果你有一个extends,那么它就是基类,否则基数是Object。在您的示例中,ClassA 没有Object作为直接基础

你也可以尝试一下自己。 Check out this example

static class ClassB {
}

static class ClassA extends ClassB {
}

static void printHierarchy (Class<?> clz) {
    if (clz != null) {
        System.out.println(clz.getSimpleName());
        System.out.print("inherits from: ");
        printHierarchy(clz.getSuperclass());
    } else {
        System.out.println("nothing");
    }
}

public static void main (String[] args) {
    printHierarchy(ClassA.class);
}

输出:

ClassA
inherits from: ClassB
inherits from: Object
inherits from: nothing

答案 1 :(得分:1)

Java不支持多重继承。相反,你所描述的是一个阶级层次。 Java中没有显式扩展类的所有类都扩展为Object。但是,如果课程A扩展B,则不会直接扩展Object。由于B直接延伸ObjectA仍然是Object的子类(如您可以Object a = new A()没有任何问题),但它不是直接子类。