我读到每个类默认都会扩展一个对象类。那么它应该会导致多重继承并且Java一定不支持。
拜托,我搜索了很多,但我无法得到关于编译器在这种情况下如何工作的正确答案。请帮帮我。
当你有类似的事情时
class A {}
然后
A
隐式扩展 Object
。事实上,字节码类似于
class A extends Object {}
现在,如果我们有
class B extends A {}
然后
B
扩展了 A
但 also 是 Object
的子类,因为 A
是 Object
的子类。然而,这不是多重继承:
对象 | A | 乙
多重继承看起来像这样:
对象A \ / \ / \ / 乙
即
B
继承自两个层次上不相关的类。
怎么可能是多重继承呢?
class Object { /* stuff */ }
class Foo /* implicit extends Object */ {}
class FooBar extends Foo /* and therefore extends Object */ {}
Object 类是所有其他类的超类(第 8.1.4 节)。
您的困惑似乎在于“多重继承”一词的含义。多重继承是指一个对象可以是多个其他类型的直接后代。
这将是多重继承的示例,Java 中不支持:
class Z extends A, B, C{
}
当您查看一个类时,例如
A
,查找继承树总是会返回到Object
。如果 A
和 Object
之间存在多个类,则这不是多重继承。可以这样画:
Object
|
SomeIntermediateClass
|
A
当单个类是继承树中至少两个“分支”的子类时,就会发生多重继承。例如:
Object
| |
A B
\ /
C
在上述情况下,
C
从多个父级继承,因此涉及多重继承。
类对象是类层次结构的根。每个类都有 Object 作为超类。所有对象(包括数组)都实现此类的方法。 Java 文档
多重继承是指一个类继承自多个不在同一继承线的类。多重继承的问题在于,如果方法和实例变量具有相同的名称,但操作或值不同,则不清楚使用哪个继承的方法或变量。
例如:
class Foo {
void baz() { }
}
class Bar {
void baz() { System.out.println("test"); }
}
class FooBar extends Foo extends Bar {}
是多重继承的一个例子。如果 FooBar 类的对象调用 baz(),我们将不知道要使用哪个 baz()。
但是,如果 FooBar 类仅扩展了 Foo 类,而不扩展了 Bar 类(并且 Foo 类扩展了 Object 类),则不是多重继承。如果要在 Foo 中编写 Object 中的方法,例如 toString(),这样的方法将覆盖 Object 的 toString(),即 FooBar 类将知道应该调用子类 Foo 的 toString() 而不是父类,对象的 toString()。