感谢您提供您的事实来源。现在我可以进入一些细节。
208页的 “深入浅出Java第二版” 说:
Java所有的类扩展对象
类对象是所有类的母亲;它是的一切的超类。
段落再往下它说:
你写的每一个类继承的对象,没有你永远不必说了吧。 [...]能想到的它,就好像你写一个类看起来是这样的:public class Dog
extends 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的第二版呈现的误导的方式牵制。 希望已经在新版本中解决了这个问题(如果有人有,请确认/反驳),否则我们应该通知作者。
将其作为质量保证知识共享 – veer7
答案更新示例 –
在事实1中,“默认情况下”是该概念的关键。 –