感谢您提供事实的来源。现在我可以说一些细节了。
“Head First Java 2nd edition”在第 208 页说:
Java 中的每个类都扩展了 Object
类对象是所有类的母亲;它是 everything 的超类。
在该段的更下方,它说:
您编写的每个类都扩展了 Object, 您无需说出来。 [...]可以把它想象成您编写的类看起来像这样:public class Dogextends Object{ } [...] Dog 已经扩展什么,犬。 [...] 编译器将使 Canine 改为扩展 Object。
虽然他们试图进行通信的一般想法(Java 中的每个类都有 java.lang.Object 作为 a 超类)是正确的,但他们使用了错误的术语,并且示例使用了 @ 987654327@ 是完全错误的,这会导致您感到困惑。
我已经编写了一个 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 语言规范。
extends的含义定义在section 8.1.4 of the JLS:
8.1.4 超类和子类
普通类声明中的可选扩展子句指定
当前类的直接超类。
Super:
extends ClassType
如您所见,extends 仅指 direct 超类。在 Head First Java 的示例中,Dog 没有扩展 Object,因为它的直接超类是 Canine。只有 Canine 扩展了 Object。
他们的意思是 Object 是 Java 中所有其他类的超类。这在 JLS section 4.3.2 中定义:
4.3.2 类对象
Object 类是所有其他类的超类(第 8.1 节)。一种
Object 类型的变量可以保存对 null 引用的引用
或任何对象,无论是类的实例还是数组
(§10)。所有类和数组类型都继承类的方法
Object,[...]
恐怕您被 Head First Java 第 2 版中的误导方式所误导。
希望已经在较新的版本中修复了这个问题(如果有人有,请确认/反驳),否则我们应该通知作者。