事実のソースを提供していただきありがとうございます。これで、少し詳しく説明できます。
「Head First Java 2nd edition」の 208 ページには次のように書かれています。
Java のすべてのクラスは Object を拡張します
Class Object はすべてのクラスの母です。それはすべてのスーパークラスです。
段落のさらに下には、次のように書かれています。
あなたが書くすべてのクラスは、何も言わなくても Object を拡張します。[...]あなたが書くクラスは次のように考えることができます:[...] Dogはすでに何かを拡張しています。[...] コンパイラは代わりにCanineを Object に拡張させます。public class Dog
extends Object
{ }
彼らが伝えようとしている (Java のすべてのjava.lang.Object
クラスがスーパークラスとして持っている) という一般的な考えは正しいのですが、彼らは間違った用語を使用しており、使用している例は明らかに間違っており、それが混乱を招いています。Dog
私は Java コンパイラー (Java 1.4 用) を作成しており、Java 言語仕様に精通しているため、ご容赦ください。
「Head First Java」という用語が間違っていることを証明するには、Java 言語仕様から引用する必要がありますが、これは少し専門的です。
しかし、まず、これをどのように見ることができるかを簡単に説明できます。
より良い定義
extend
別のクラスを明示的に実行しない Java のすべてのクラスは、拡張されます。Object
あなたが書くとき:
class Canine { }
次に、コンパイラはこれを次のように解釈します。
class Canine extends Object { }
しかし、あなたが書くとき:
class Dog extends Canine { }
次に、コンパイラは、クラスが既に明示的に拡張されていることを確認し、コードの意味を変更しません。
Head First Java second edition は Java 5 に基づいているため、Java のそのバージョンの Java 言語仕様を使用します。
extendsの意味は、 JLS のセクション 8.1.4 で定義されています。
8.1.4 スーパークラスとサブクラス
通常のクラス宣言のオプションの extends 句は、現在のクラスの直接のスーパークラスを指定します。
Super:
extends ClassType
ご覧のとおり、extendsは直接のスーパークラスのみを参照します。Head First Java の例では、直接のスーパークラスがCanineであるため、 Dog は Object を拡張しません。Canineだけが Object を拡張します。
彼らが言いたかったのは、Object は Java の他のすべてのクラスのスーパークラスだということです。これはJLS セクション 4.3.2で定義されています。
4.3.2 クラスオブジェクト
このクラスObject
は、他のすべてのクラスのスーパークラス (§8.1) です。タイプの変数は、クラスまたは配列のインスタンスであるかどうかにかかわらず、参照または任意のオブジェクトObject
への参照を保持できます (§10)。null
すべてのクラスおよび配列型は、クラスのメソッドを継承します
Object
[...]
これが Head First Java の第 2 版で提示されたという誤解を招くような方法で脱線してしまったのではないでしょうか。新しい版でこれが修正されていることを願っています (誰かが持っている場合は、確認/反論してください)。それ以外の場合は、著者に通知する必要があります。