每个类都扩展了Object?

时间:2013-10-04 20:17:16

标签: java inheritance

我读到默认情况下每个类都扩展了一个对象类。那么它应该导致多重继承,Java不能支持。

请搜索很多,但无法得到正确答案/编译器在这种情况下的工作原理。请帮帮我。

6 个答案:

答案 0 :(得分:16)

当你有类似

的东西时
class A {}

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

class A extends Object {}

现在,如果我们有

class B extends A {}

然后B扩展A,但Object的子类,因为AObject的子类。但是,这不是多重继承:

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。如果AObject之间有多个类,则这不是多重继承。这可以这样绘制:

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()。