我读到每个类默认扩展一个对象类。那么它应该会导致多重继承,并且Java一定不支持。
请进行大量搜索,但无法获得正确的答案/在这种情况下编译器是如何工作的。请帮帮我。
我读到每个类默认扩展一个对象类。那么它应该会导致多重继承,并且Java一定不支持。
请进行大量搜索,但无法获得正确的答案/在这种情况下编译器是如何工作的。请帮帮我。
当你有类似的东西
class A {}
然后A
隐式扩展Object
。事实上,字节码类似于
class A extends Object {}
现在,如果我们有
class B extends A {}
然后B
extendsA
但也是的子类Object
,因为A
是 的子类Object
。然而,这不是多重继承:
目的 | 一个 | 乙
多重继承看起来像这样:
对象 A \ / \ / \ / 乙
即B
从两个层次不相关的类继承。
How can it be multiple inheritance?
class Object { /* stuff */ }
class Foo /* implicit extends Object */ {}
class FooBar extends Foo /* and therefore extends Object */ {}
The rules are described in the Java Language Specification:
The class Object is a superclass (§8.1.4) of all other classes.
您的困惑似乎是“多重继承”一词的含义。多重继承是指当一个对象可以是多个其他类型的直接后代时。
这将是多重继承的示例,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()。