每个类都扩展 Object 吗? [已关闭]

问题描述 投票:0回答:6

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

拜托,我搜索了很多,但我无法得到关于编译器在这种情况下如何工作的正确答案。请帮帮我。

java inheritance
6个回答
22
投票

当你有类似的事情时

class A {}

然后

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

class A extends Object {}

现在,如果我们有

class B extends A {}

然后

B
扩展了
A
also
Object
的子类,因为
A
Object
的子类。然而,这不是多重继承:

对象
  |
  A
  |
  乙

多重继承看起来像这样:

对象A
  \ /
   \ /
    \ /
     乙

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


5
投票

怎么可能是多重继承呢?

class Object { /* stuff */ }

class Foo /* implicit extends Object */ {}

class FooBar extends Foo /* and therefore extends Object */ {}

Java 语言规范中描述了规则

Object 类是所有其他类的超类(第 8.1.4 节)。


2
投票

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

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

class Z extends A, B, C{

}

1
投票

当您查看一个类时,例如

A
,查找继承树总是会返回到
Object
。如果
A
Object
之间存在多个类,则这不是多重继承。可以这样画:

Object
|
SomeIntermediateClass
|
A

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

Object
|   |
A   B
 \ /
  C

在上述情况下,

C
从多个父级继承,因此涉及多重继承。


0
投票

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


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

© www.soinside.com 2019 - 2024. All rights reserved.