web-dev-qa-db-ja.com

Objectクラスをサブクラスのスーパークラスにするにはどうすればよいですか?

事実1:

Javaは多重継承をサポートしていません。

事実2:

オブジェクトは他のすべてのクラスのスーパークラスです

クラスParentとクラスChildを継承しているクラスParentがある場合:

class Parent {

}

class Child extends Parent {

}

この場合、Javaが多重継承をサポートしていない場合、クラスChildはどのようにObjectクラスを継承しますか?

これら3つの関係はどのように定義されていますか?

オプション1:

enter image description here

オプション2:

enter image description here

13
Abhishek Keshri

これはオプション2です。スーパークラスを定義すると、それがクラスの直接のスーパークラスになります。定義しない場合、Objectが直接のスーパークラスになります。

class Parent {

}

class Child extends Parent {

}

と同等です

class Parent extends Object {

}

class Child extends Parent {

}

したがって、Objectはすべてのクラスのスーパークラスですが、Objectに到達する前にクラス階層にいくつかのステップがある場合があります。これは、すべてのクラスの直接のスーパークラスではありません。

26
Max Vollmer

Objectは直接の親ではないかもしれませんが、常にスーパーの親です。

Child extends Parent
Parent extends Object

 |
 V

Child [indirectly] extends Object
8
Andrew Tobilko

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は、直接スーパークラスであるか、推移的な関係により、他のクラスの最後のスーパークラスです。

質問への回答:

  • Javaは多重継承をサポートしていません:推移的な方法で単一の継承を提供します。すべてのクラスは、1つのスーパーカルのみを直接拡張します。
  • 関係はどうですか:クラスParentはクラスPointとクラスChildに対応しますJLSの例のクラスColoredPointに。 オプション2のみがこの関係を示しています。
6
LuCio

さて、それは興味深い議論です。オプション番号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
5
codeLover

オプション2、すべてのオブジェクトがObject.classメソッドを派生させるため

3

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);
3
Joop Eggen

正解はオプション2です。任意のJavaクラスは、親のすべての親を継承します。つまり、.

クラスAはクラスBを拡張しますクラスBはクラスCを拡張しますクラスCはクラスDを拡張します

クラスXはAを拡張します->これは、AがB、C、およびDからすべての保護/パッケージ/パブリックフィールドを継承することを意味します。

あなたの例では、クラスの子は親のプロパティを継承しますが、推移的なモードではオブジェクトのプロパティも継承します。

3
admoca60

まず第一に、Java 8を使用して、を達成することが可能です デフォルトのメソッドを使用して多重継承インターフェイス

次に、オブジェクトクラスに関する理解が「オプション2」に正しく表されています。
ただし、これは多重継承ではなく、マルチレベル継承です。 「オプション1」は多重継承です。

詳細については、こちらを確認してください リンク

3
Shashank Singh

から Class Object

public class Object
クラスオブジェクトは、クラス階層のルートです。
すべてのクラスには、スーパークラスとしてObjectがあります。
配列を含むすべてのオブジェクトは、このクラスのメソッドを実装します。

これは、すべてのJavaクラスが階層のルートとしてObjectを持っていることを意味し、必ずしもその直接の親としてではありません。

3
fantaghirocco

オプション2.Objectは他のすべてのクラスのスーパークラスですが、Objectはクラスの直接のスーパークラスではない場合があります。

2
zzcron toby