Java が 1 つのクラスしか拡張できず、すべてのクラスが を拡張するjava.lang.Object
場合、どうすれば別のクラスを拡張できるでしょうか? そして、なぜすべてのクラスが書いていないのですextends Object
か?
8 に答える
Java が 1 つのクラスしか拡張できず、すべてのクラスが java.lang.Object を拡張する場合、別のクラスを拡張するにはどうすればよいでしょうか?
A が B を拡張すると言うとき、それは A が B を拡張し、 B が B を拡張することを意味しますObject
。あるクラスは、別のクラスから継承できる別のクラスから継承でき、チェーンの最上位は ですjava.lang.Object
。Java は多重継承をサポートしていませんが、マルチレベル継承をサポートしています。
すべてのクラスに「extends Object」と書かれていないのはなぜですか?
すべてのクラスはObject
暗黙的に拡張されるため、冗長なコーディングになります。
java.lang.Object は Java のすべてのオブジェクトの親であるため、明示的に記述する必要はありません。extends Object
どのクラスもいつでも拡張できます。2 つのクラスの動作が必要な場合 - そのためにインターフェイスを使用する必要があります
Java のすべてのクラスは暗黙的にclassObject
を拡張し、もう 1 つのクラスを拡張する権限と無限の数のインターフェースしかありません。
コンストラクターを作成しなかった場合、クラスごとに 1 つの既定のコンストラクターを持つのと同じです。
だからあなたが言うとき
class A{
}
実際には次のようになります。
class A extends Object{
A(){
super();
}
}
しかし、あなたが言うとき、あなたが言うとき
class B extends A
この場合、クラス B はクラス A の機能を持ち、A が Object を拡張するため、クラス B もクラス Object を継承します。
A -> オブジェクト
B -> A
だから
B -> オブジェクト
拡張が許可されている唯一のものは、Object
最終的にクラスも拡張します。したがって、2回拡張することはありません。
オブジェクト指向プログラミング (OOP) では、継承は、一方が他方のサブタイプまたは子であると言われる、オブジェクトの 2 つのタイプまたはクラス間の関係を記述します。
A -> B -> C -> D
子は親の機能を継承し、共有機能を可能にします。たとえば、食べるなどの機能を持つ変数クラス Animal を作成できます。次に、これらの機能を明示的にプログラムしなくても継承するサブタイプの Dog を定義し、猫を追いかけるなどの新しい機能を追加します。
多重継承により、プログラマーは複数の階層を同時に使用できます。たとえば、Dog が Robot キャラクターと Animal から継承し、それらすべてのクラス内の機能にアクセスできるようにします。
A
/ \
C D
\ /
E
Java は最初のモデルを使用するため、オブジェクトや別のクラスから継承しても、本質的に階層的であるため、問題は発生しません。
Object -> Animal -> Dog -> Pit Bull
すべてのオブジェクトが Object を拡張する必要がない理由は、それが暗黙的に行われるためです。
Java では多重継承はサポートされておらず、(いわば) 直線でしか継承できません。ただし、IMO よりもはるかに強力なインターフェイスを使用します。多重継承は必要ありませんでしたが、インターフェイスを多用しています。基本的に、2 番目のクラスを作成する代わりに、インターフェイスを定義してから、いくつかのクラスにそれを実装させます。これは、別のクラスでも同じでもかまいません。
すべてのクラスはすでにオブジェクトから派生しているため、具体的に記述する必要はありません。
次のそれぞれは、オブジェクトを左に拡張できます:
オブジェクト -> 車両 -> 車 -> クーペ -> カマロ
たとえば、Coupe
は を拡張Car
していますが、(直接) 拡張しているわけではありませんObject
... チェーンを上っていくと、最終的に に到達するだけObject
です。
ただし、両方をCoupe
拡張することはできませんでしたCar
Truck
以下は、Java の java.lang.Number クラスのクラス階層を示す例です。
http://docs.oracle.com/javase/tutorial/java/data/numberclasses.html
ご覧のとおり、Integer クラスは Number を継承し、Number は Object を継承しています。したがって、複数のクラスを連鎖させることで継承できます。