2013-10-04 50 views
-1

我读过每个类默认扩展一个对象类。那么它应该导致多重继承,并且不能被Java支持。每个类都扩展Object?

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

+0

是的......但多重继承是**不是**这个 – ppeterka

+1

不是每个类_directly_扩展了'Object'。给定'A类扩展对象'和'B类扩展A','A'直接扩展'Object','B'直接扩展'A','B'通过'A'间接扩展'Object'。如果'B'通过两条不同的路径扩展了'Object',那么只有钻石问题。一个类有多个超类并不一定意味着你有多重继承。 –

回答

4

它怎么可能是多重继承?

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

类对象所有其他类的超类(§8.1.4)。

+0

编译器是如何知道的?任何机构都告诉我编译器是如何工作的? – user2848012

+0

@ user2848012编译器如何知道什么?规则在Java语言规范中指定。为了使编译器与Java兼容,它需要遵循这些规则。 –

14

当你有像

class A {} 

然后A隐含延伸Object。事实上字节码类似

class A extends Object {} 

现在,如果我们有

class B extends A {} 

然后B延伸A,但Object一个子类,因为AObject子类。这是没有,不过,多重继承:

 
Object 
    | 
    A 
    | 
    B 

多重继承应该是这样的:

 
Object A 
    \ /
    \ /
    \/
    B 

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

0

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

1

您的困惑似乎在术语“多重继承”中。多重继承指对象可以是多于一个其他类型的DIRECT后代。

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

class Z extends A, B, C{ 

} 
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),那么它不是多继承。如果Object中的方法(如toString())要写入Foo,则此方法将覆盖Object的toString(),即类FooBar会知道子类Foo的toString()应该被调用,而不是父类, Object的toString()。

1

当你看一个类,例如A,查找继承树将始终返回到Object。如果AObject之间有多个类别,则这不是多重继承。由此可得出像这样:当一个类是继承树至少有两个“分支”的子发生

Object 
| 
SomeIntermediateClass 
| 
A 

多重继承。例如:

Object 
| | 
A B 
\/
    C 

在上述情况下,C从多个父母继承,并因此参与多继承。

相关问题