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

lea*_*boy 1 java oop inheritance multiple-inheritance

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

ClassA extends Object{
}
Run Code Online (Sandbox Code Playgroud)

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

ClassA extends Object extends ClassB {
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jas*_*n C 8

没有.

它将继承自ClassB继承自Object的ClassA.

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

Object -> ClassB -> ClassA
Run Code Online (Sandbox Code Playgroud)

多重继承允许您执行更多树:

Object -> ClassB \
                  ---> ClassA
Object -> ClassC /
Run Code Online (Sandbox Code Playgroud)

Java不允许你做后者.您可以获得的最接近的是实现多个接口.

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

                  /--> ClassC
Object -> ClassB -
                  \--> ClassD
Run Code Online (Sandbox Code Playgroud)

另外,为了回答您的直接问题,JLS 8.1.4声明(强调我的):

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

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


你也可以尝试一下自己.看看这个例子:

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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

ClassA
inherits from: ClassB
inherits from: Object
inherits from: nothing
Run Code Online (Sandbox Code Playgroud)