我读到默认情况下每个类都扩展了一个对象类。那么它应该导致多重继承,Java不能支持。
请搜索很多,但无法得到正确答案/编译器在这种情况下的工作原理。请帮帮我。
答案 0 :(得分:16)
当你有类似
的东西时class A {}
然后A
隐式扩展Object
。实际上字节码类似于
class A extends Object {}
现在,如果我们有
class B extends A {}
然后B
扩展A
,但也是Object
的子类,因为A
是Object
的子类。但是,这不是多重继承:
Object | A | B
多重继承看起来像这样:
Object A \ / \ / \ / B
即。 B
继承自两个层次不相关的类。
答案 1 :(得分:5)
如何进行多重继承?
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:
Object类是所有其他类的超类(第8.1.4节)。
答案 2 :(得分:1)
您的困惑似乎与“多重继承”一词的意思相同。多重继承是指对象可以是多个其他类型的DIRECT后代。
这是多重继承的一个例子,在Java中不受支持:
class Z extends A, B, C{
}
答案 3 :(得分:1)
当您查看某个类时,例如A
,查找继承树将始终返回Object
。如果A
和Object
之间有多个类,则这不是多重继承。这可以这样绘制:
Object
|
SomeIntermediateClass
|
A
当单个类是继承树中至少两个“分支”的子级时,会发生多重继承。例如:
Object
| |
A B
\ /
C
在上面的例子中,C
继承自多个父项,因此参与了多重继承。
答案 4 :(得分:0)
Class Object是类层次结构的根。每个类都有Object作为超类。所有对象(包括数组)都实现此类的方法。 Java documentation
答案 5 :(得分:0)
多重继承意味着一个类继承自多个不在同一继承行中的类。多重继承的问题是,如果方法和实例变量具有相同的名称但操作或值不同,则不清楚要使用哪个继承的方法或变量。
例如:
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()。