2014-04-05 21 views
1

在java中这两个事实“Java所有的类扩展元类对象”是否意味每个子类中导致钻石问题

事实1

在默认情况下,Java所有的类扩展了Java元类Object

事实2

多重继承不允许在Java”在此处详细了解钻石proble Java inheritance

安静混乱

假设ClassB延伸ClassA然后根据fact1 ClassB延伸Object

enter image description here

这是否意味着ClassB扩展ClassAObject?这是多重继承的情况吗?

如果它不是多重继承,那么这两个语句怎么不矛盾呢?

+0

将其作为质量保证知识共享 – veer7

+0

答案更新示例 –

+0

在事实1中,“默认情况下”是该概念的关键。 –

回答

2

是的,这两个陈述都是正确的。

确实,java中的每个类都扩展了元类Object

Still ClassB没有多重继承,因为在编译时java将Object类移动了一个级别。

enter image description here

这种方式现在ClassA现在扩展Object,而不是ClassB

这种方式ClassB没有多重继承,所以我们遵循了事实2。

现在ClassB延伸ClassA因此ClassA延伸Object通过多级继承 ClassB的延伸Object; fact1其次

6

“在默认情况下的Java的每个类扩展了Java元类对象” // fact1

每类扩展Object类,只如果他们不直接扩展任何其他类

如果一个类Test扩展了另一个Sample类,然后Test不直接延伸Object类,但是,通过超类Sample,这直接扩展Object类继承Object类的行为。

3

感谢您提供您的事实来源。现在我可以进入一些细节。

208页的 “深入浅出Java第二版” 说:

Java所有的类扩展对象

类对象是所有类的母亲;它是的一切的超类。

段落再往下它说:

你写的每一个类继承的对象,没有你永远不必说了吧。 [...]能想到的它,就好像你写一个类看起来是这样的:public class Dogextends Object{ } [...]狗已经延伸的东西,。 [...]编译器会让Canine扩展Object。

虽然他们试图进行沟通(在Java中每个类都有java.lang.Object一个超类)的总体思路是正确的,他们使用的是错误的术语,并且使用Dog的例子是完全错误的,并这会导致你的困惑。

我写了一个Java编译器(用于Java 1.4),我对Java语言规范非常熟悉,请耐心等待。

为了证明术语是“Head First Java”是错误的,我需要引用来自Java语言规范,这是有点技术性的。

但是,我可以给你一个更简单的解释,你可以看到这一点。

更好的定义

Java所有的类,没有extend另一个阶级明确,扩展Object

当你写:

class Canine { } 

那么编译器采用此意思是:

class Canine extends Object { } 

但是,当你写:

class Dog extends Canine { } 

那么编译器看到你已经明确地扩展一个类, 不会改变你的代码的含义。

由于Head First Java第二版基于Java 5,因此我将使用该Java版本的Java语言规范。

含义延伸section 8.1.4 of the JLS定义:

8.1.4超类和子类

可选延伸子句中一个普通的类声明指定 的直接超类当前班级的

Super: 
    extends ClassType 

正如你看到的,延伸仅指直接超。在Head First Java的例子中,Dog不扩展Object,因为它的直接超类是Canine。只有扩展对象。

他们的意思是说,Object是Java中所有其他类的超类。这在JLS section 4.3.2定义:

4.3.2类对象

Object是所有其他类的超类(第8.1节)。 A 类型为Object的变量可以持有对null参考 或对任何对象的引用,无论它是类别实例还是数组 (第10节)。所有类和数组类型继承 Object类的方法,[...]

我怕你被这在头第一个Java的第二版呈现的误导的方式牵制。 希望已经在新版本中解决了这个问题(如果有人有,请确认/反驳),否则我们应该通知作者。

+0

请参阅Head First Java第2版,(第208页)。 – veer7

+0

它用粗体书写“Java中的每个类都扩展了类对象”。并且“编译器将使Canine扩展对象变为” – veer7

+0

您引用了“Java中的每个类hasObject作为祖先,但是说Java中的每个类extendsObject都是不正确的。”请给我指出任何可能会帮助我更好地理解它的文档或参考。 – veer7