“java中的每个类都扩展了MetaClass对象”这是否意味着每个子类都会导致Diamond问题

这两个事实在java中

事实1

默认情况下,java中的每个类都扩展了java元类Object

事实2

Java中不允许多重inheritance ”在Javainheritance中阅读有关钻石问题的更多信息

很安静,令人困惑

假设ClassB扩展ClassA然后根据fact1 ClassB扩展Object

在此处输入图像描述

这是否意味着ClassB正在扩展ClassAObject ? 这是多重inheritance的情况吗?

如果它不是多重inheritance那么这两个陈述怎么不相矛盾呢?

“默认情况下,java中的每个类都扩展了java元类Object”// fact1

每个类都扩展了Object类, 只有它们不直接扩展任何其他类

如果类Test扩展了另一个Sample类,那么Test不会直接扩展Object类,而是通过超类SampleinheritanceObject类行为,它直接扩展了Object类。

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

“Head First Java 2nd edition”在第208页上说:

Java中的每个类都扩展了Object

Class Object是所有类的母亲; 它是一切的超类。

在段落的下面,它说:

你编写的每个类都扩展了Object,你无需说出来。 […]可以把它想象成你写的类看起来像这样: public class Dog extends Object { } […] Dog 已经扩展了一些东西, Canine 。 […]编译器将使Canine扩展Object。

虽然他们试图沟通的一般想法(Java中的每个类都有java.lang.Object作为超类)是正确的,但他们使用的是错误的术语,而使用Dog的示例是完全错误的,这导致你的困惑。

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

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

但首先,我可以给你一个更简单的解释,你怎么看到这个。

更好的定义

Java中的每个类都没有显式extend另一个类,它扩展了Object

当你写:

 class Canine { } 

然后编译器将其表示:

 class Canine extends Object { } 

但是当你写:

 class Dog extends Canine { } 

然后编译器会发现您已经显式扩展了一个类,并且没有更改代码的含义。

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

扩展的含义在JLS的8.1.4节中定义:

8.1.4超类和子类

普通类声明中的可选extends子句指定当前类的直接超类。

 Super: extends ClassType 

如您所见, extends仅指直接超类。 在Head First Java的示例中,Dog不扩展Object,因为它的直接超类是Canine 。 只有Canine扩展了Object。

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

4.3.2类对象

Object类是所有其他类的超类(第8.1节)。 Object类型的变量可以包含对null引用或任何对象的引用,无论它是类的实例还是数组(第10节)。 所有类和数组类型都inheritance了Object类的方法,[…]

我担心你会被第一版Java头版第2版中的误导性方式所牵制。 希望已经在新版本中修复了这个问题(如果有人有,请确认/反驳),否则我们应该通知作者。

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

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

仍然ClassB没有多重inheritance,因为在编译时java将Object Class移动一级。

在此处输入图像描述

这样,现在ClassA现在扩展了Object而不是ClassB

这样, ClassB没有多重inheritance,因此遵循fact2。

现在ClassB扩展了ClassAClassA扩展Object从而通过MultiLEVELinheritance ClassB extends Object ; 事实1紧随其后