【问题标题】:Every subclass in Java inherits from two classes (Object and its superclass)?Java 中的每个子类都继承自两个类(对象及其超类)?
【发布时间】:2016-11-28 17:45:41
【问题描述】:

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

ClassA extends Object{
}

所以,如果我要让 ClassA 继承自 ClassB,会不会是这样

ClassA extends Object extends ClassB {
}

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

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

【问题讨论】:

  • 多重继承有两个直接超类。相反,这是一个类层次结构,其中B 扩展了A,而Object 又扩展了Object
  • Object唯一的特殊例外是:“extends子句不能出现在类Object的定义中,否则会发生编译时错误,因为它是原始类并且没有直接超类。” (来自JLS Sec 8.1.4

标签: java oop inheritance multiple-inheritance


【解决方案1】:

没有。

应该是 ClassA 继承自 ClassB,而 ClassB 继承自 Object。

这不是多重继承。这是单继承。单继承给你一种链:

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

【讨论】:

    【解决方案2】:

    Java 不支持多重继承。相反,您所描述的是阶级层次结构。 Java 中所有没有显式扩展类的类,扩展Object。但是,如果一个类A 扩展B,那么它不是直接扩展Object。因为B 直接扩展了Object,所以A 仍然是Object 的子类(如Object a = new A() 没有任何问题),但它不是直接子类。

    【讨论】:

    • @Andreas 我不打算这样做。我会编辑我的答案。谢谢。
    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 2011-10-01
    相关资源
    最近更新 更多