0

我读到每个类默认扩展一个对象类。那么它应该会导致多重继承,并且Java一定不支持。

请进行大量搜索,但无法获得正确的答案/在这种情况下编译器是如何工作的。请帮帮我。

4

6 回答 6

21

当你有类似的东西

class A {}

然后A隐式扩展Object。事实上,字节码类似于

class A extends Object {}

现在,如果我们有

class B extends A {}

然后BextendsA也是的子类Object,因为A是 的子类Object。然而,这不是多重继承:

目的
  |
  一个
  |
  乙

多重继承看起来像这样:

对象 A
  \ /
   \ /
    \ /
     乙

B从两个层次不相关的类继承。

于 2013-10-04T20:20:11.573 回答
5

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.

于 2013-10-04T20:18:48.870 回答
2

您的困惑似乎是“多重继承”一词的含义。多重继承是指当一个对象可以是多个其他类型的直接后代时。

这将是多重继承的示例,Java 不支持:

class Z extends A, B, C{

}
于 2013-10-04T20:24:29.317 回答
1

例如,当您查看一个类时A,查找继承树总是会返回到Object. A如果和之间有多个类Object,则这不是多重继承。这可以画成这样:

Object
|
SomeIntermediateClass
|
A

当一个类是继承树中至少两个“分支”的子类时,就会发生多重继承。例如:

Object
|   |
A   B
 \ /
  C

在上述情况下,C是从多个父母继承,因此涉及多重继承。

于 2013-10-04T20:27:43.350 回答
0

类对象是类层次结构的根。每个类都有 Object 作为超类。所有对象,包括数组,都实现了这个类的方法。 Java 文档

于 2013-10-04T20:20:28.607 回答
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()。

于 2013-10-04T20:26:21.690 回答