1

Javaのこれらの2つの事実

事実1

「<strong>Java のすべてのクラスは、デフォルトで Java メタ クラスを拡張しますObject

事実2

「<strong>Java では複数の継承は許可されていません」ダイヤモンドの問題について詳しくは、 Java の継承をご覧ください。

混乱している

次に、fact1 ClassBextendsClassA に従って拡張するとしClassBます。Object

ここに画像の説明を入力

と の両方をClassB拡張しているということですか?多重継承の場合ですか? ClassAObject

多重継承でない場合、2 つのステートメントが矛盾していないのはなぜですか?

4

3 に答える 3

7

「Java のすべてのクラスは、デフォルトで Java メタ クラス オブジェクトを拡張します」 //fact1

すべてのクラスは、他のクラスを直接拡張しない場合にのみ、Objectクラスを拡張します。

Testクラスが別のSampleクラスを拡張する場合、クラスを直接Test拡張するのではなく、クラスを直接拡張Objectするスーパー クラスを通じて Object クラスの動作を継承します。SampleObject

于 2014-04-05T13:42:55.880 に答える
3

事実のソースを提供していただきありがとうございます。これで、少し詳しく説明できます。

「Head First Java 2nd edition」の 208 ページには次のように書かれています。

Java のすべてのクラスは Object を拡張します

Class Object はすべてのクラスの母です。それはすべてのスーパークラスです。

段落のさらに下には、次のように書かれています。

あなたが書くすべてのクラスは、何も言わなくても Object を拡張します。[...]あなたが書くクラスは次のように考えることができます:[...] Dogはすでに何かを拡張してます。[...] コンパイラは代わりにCanineを Object に拡張させます。public class Dogextends 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 版で提示されたという誤解を招くような方法で脱線してしまったのではないでしょうか。新しい版でこれが修正されていることを願っています (誰かが持っている場合は、確認/反論してください)。それ以外の場合は、著者に通知する必要があります。

于 2014-04-05T17:04:19.767 に答える
2

はい、両方のステートメントが正しいです。

Java のすべてのクラスがメタ クラスを拡張するのは事実ですObject

Objectコンパイル時にJavaがクラスを1レベルシフトするため、ClassBには多重継承がありません。

ここに画像の説明を入力

この方法はClassA今では拡張ObjectされていませんClassB

この方法ClassBには多重継承がないため、fact2 に従います。

このように、 MultiLEVEL Inheritance ClassB extendsClassBを介して拡張ClassA およびClassA 拡張されます。事実1 followedObjectObject

于 2014-04-05T13:40:08.430 に答える