Java 每个类都扩展对象?

Java 每个类都扩展对象?,java,inheritance,Java,Inheritance,我了解到,默认情况下,每个类都扩展了一个对象类。那么它应该会导致多重继承,而且Java不支持它 请进行大量搜索,但无法获得正确答案/在这种情况下编译器是如何工作的。请帮帮我 怎么可能是多重继承 class Object { /* stuff */ } class Foo /* implicit extends Object */ {} class FooBar extends Foo /* and therefore extends Object */ {} : 类对象是所有其他类的超类§

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


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

怎么可能是多重继承

class Object { /* stuff */ }

class Foo /* implicit extends Object */ {}

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

类对象是所有其他类的超类§8.1.4


当你有类似

class A {}
然后一个隐式扩展对象。事实上,字节码类似于

class A extends Object {}
现在,如果我们有

class B extends A {}
然后B扩展了A,但也是Object的子类,因为A是Object的子类。但是,这不是多重继承:

Object | A | B 多重继承如下所示:

Object A \ / \ / \ / B i、 e.B继承自两个层次无关的类

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


你的困惑似乎在于多重继承这个术语的含义。多重继承是指对象可以是多个其他类型的直接后代的情况

这是多重继承的一个例子,Java不支持:

class Z extends A, B, C{

}

多重继承意味着一个类从不在同一继承行中的多个类继承。多重继承的问题是,如果方法和实例变量具有相同的名称,但操作或值不同,则不清楚要使用哪个继承的方法或变量

例如:

class Foo {
    void baz() { }
}
class Bar {
    void baz() { System.out.println("test"); }
}
class FooBar extends Foo extends Bar {}
Object
|   |
A   B
 \ /
  C
是多重继承的一个例子。如果FooBar类的对象名为baz,我们将不知道使用哪个baz


然而,若类FooBar仅扩展类Foo,而不是类Bar和类Foo扩展类对象,则这不是多重继承。如果对象中的某个方法(如toString)是用Foo编写的,则该方法将覆盖对象的toString,即FooBar类将知道应该调用子类Foo的toString,而不是父类Object的toString。

当您查看一个类时,例如,查找继承树将始终返回到对象。如果和对象之间存在多个类,则这不是多重继承。可以这样画:

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

class Foo {
    void baz() { }
}
class Bar {
    void baz() { System.out.println("test"); }
}
class FooBar extends Foo extends Bar {}
Object
|   |
A   B
 \ /
  C

在上述情况下,C继承自多个父代,因此涉及多重继承。

是。。。但多重继承并不是每个类都直接扩展对象。给定类A扩展对象,类B扩展A,A直接扩展对象,B直接扩展A,B通过A间接扩展对象。如果B通过两条不同的路径扩展对象,则只会出现菱形问题。一个类有多个超类并不一定意味着你有多个继承。编译器是如何知道的。有人能告诉我编译器是如何在这里工作的吗?@user2848012编译器是如何知道的?这些规则在Java语言规范中指定。为了使编译器与Java兼容,它需要遵循这些规则。我们说公共类a{}隐式扩展对象,所以它等于公共类a扩展对象。当我们有公共类B扩展A时,因为如果只有公共类B,它等于公共类B扩展对象,所以现在公共类B扩展A等于公共类B扩展对象。也许这就是为什么有人把这个问题搞混了。简而言之,隐式扩展只有在没有提供显式扩展时才会发生。