事実1:
Javaは多重継承をサポートしていません。
事実2:
オブジェクトは他のすべてのクラスのスーパークラスです
クラスParent
とクラスChild
を継承しているクラスParent
がある場合:
class Parent {
}
class Child extends Parent {
}
この場合、Javaが多重継承をサポートしていない場合、クラスChild
はどのようにObject
クラスを継承しますか?
これら3つの関係はどのように定義されていますか?
オプション1:
オプション2:
これはオプション2です。スーパークラスを定義すると、それがクラスの直接のスーパークラスになります。定義しない場合、Object
が直接のスーパークラスになります。
class Parent {
}
class Child extends Parent {
}
と同等です
class Parent extends Object {
}
class Child extends Parent {
}
したがって、Object
はすべてのクラスのスーパークラスですが、Object
に到達する前にクラス階層にいくつかのステップがある場合があります。これは、すべてのクラスの直接のスーパークラスではありません。
Object
は直接の親ではないかもしれませんが、常にスーパーの親です。
Child extends Parent
Parent extends Object
|
V
Child [indirectly] extends Object
JavaDoc は次のように述べています。
クラス
Object
は、クラス階層のルートです。 .。
クラスがキーワードextends
を使用してデカールすることによって他のクラスを拡張しない場合、それはObject
から暗黙的に拡張されます。
ドキュメント は次のように述べています。
他の明示的なスーパークラスがない場合、すべてのクラスは暗黙的にObjectのサブクラスです。
JLSの8.1.4 章の 例8.1.4-1 "Direct Superclasses and Subclasses"を参照してください。
class Point { int x, y; }
"はObjectの直接のサブクラスです"
さらに、ドキュメントには次のように書かれています。
クラスは、クラスから派生したクラスから派生したクラスなどから派生でき、最終的には最上位のクラス
Object
から派生します。このようなクラスは、Object
に戻る継承チェーン内のすべてのクラスの子孫であると言われます。
JLSは、それを短く正式なものと述べています。
サブクラス関係は、直接サブクラス関係の推移閉包です。
したがって、クラスObject
はすべてのクラスのスーパークラスです。
しかし、ドキュメントには次のようにも書かれています。
スーパークラスを持たない
Object
を除いて、すべてのクラスには1つだけの直接スーパークラス(単一継承)があります。
例を続けるとclass ColoredPoint extends Point { int color; }
"はクラスPoint
。"の直接のサブクラスです。推移的な関係により、それはクラスObject
の(非直接)サブクラスです。
要約:Object
は、直接スーパークラスであるか、推移的な関係により、他のクラスの最後のスーパークラスです。
質問への回答:
Parent
はクラスPoint
とクラスChild
に対応しますJLSの例のクラスColoredPoint
に。 オプション2のみがこの関係を示しています。さて、それは興味深い議論です。オプション番号2になると思います。以下のコードを試してみるように。
public static void main(String []args){
Parent p=new Parent();
Class c= p.getClass();
Child child =new Child();
Class c1= child.getClass();
System.out.println(c.getSuperclass());
System.out.println(c1.getSuperclass());
}
次のように出力されます:
class Java.lang.Object
class Parent
オプション2、すべてのオブジェクトがObject.classメソッドを派生させるため
Javaクラスは1つのクラスのみを拡張し、1つの直接の基本クラスを持ちます。間接的にクラスは多くの祖先を持つことができます。子は祖先の「スーパー」クラスとして親とオブジェクトを持ちます。
Object --> Parent --> Child
--> OtherChild
Relation: 1 --> N
C++のように多重継承を回避する理由は、関連するあいまいさでした。
多重継承を想定した擬似コード:
class A : Comparable
class B : Comparable
class Child : A, B {
@Override A? B?
int compareTo(Child rhs) { ... super.compareTo ? ... }
}
A a = new Child();
B b = new Child();
a.compareTo(b);
正解はオプション2です。任意のJavaクラスは、親のすべての親を継承します。つまり、.
クラスAはクラスBを拡張しますクラスBはクラスCを拡張しますクラスCはクラスDを拡張します
クラスXはAを拡張します->これは、AがB、C、およびDからすべての保護/パッケージ/パブリックフィールドを継承することを意味します。
あなたの例では、クラスの子は親のプロパティを継承しますが、推移的なモードではオブジェクトのプロパティも継承します。
まず第一に、Java 8を使用して、を達成することが可能です デフォルトのメソッドを使用して多重継承インターフェイス 。
次に、オブジェクトクラスに関する理解が「オプション2」に正しく表されています。
ただし、これは多重継承ではなく、マルチレベル継承です。 「オプション1」は多重継承です。
詳細については、こちらを確認してください リンク 。
から Class Object
public class Object
クラスオブジェクトは、クラス階層のルートです。
すべてのクラスには、スーパークラスとしてObjectがあります。
配列を含むすべてのオブジェクトは、このクラスのメソッドを実装します。
これは、すべてのJavaクラスが階層のルートとしてObject
を持っていることを意味し、必ずしもその直接の親としてではありません。
オプション2.Objectは他のすべてのクラスのスーパークラスですが、Objectはクラスの直接のスーパークラスではない場合があります。