3
public interface A {
    class Aclass {
        int constants = 100;
        public void display()
        {
            System.out.println("Inside A");
        }
    }
    public void display();

}
public interface B {
    class Bclass {
        int constants = 130;

        public void display() {
            System.out.println("Inside B");
        }
    }
    public void display();
}

public class MultipleInheritance implements A, B {

    @Override
    public void display() {
        A.Aclass a = new A.Aclass();
        System.out.println(a.constants);
        B.Bclass b = new B.Bclass();
        System.out.println(b.constants);
    }

    public static void main(String args[]) {

        new MultipleInheritance().display();
    }
}

それはインターフェイスを介しており、何も継承していないコンテキスト内の具体的なクラスを介していませんが、内部クラスを維持することは困難ですが、それでも多重継承として機能しますが、メモリ表現で明確にしてください。もし可能なら。

4

4 に答える 4

5

コードに実際に含まれているものを確認しましょう。Aここでは、インターフェイスとネストされたクラスを宣言しますAClass

public interface A {
    class Aclass {
        int constants = 100;
        public void display()
        {
            System.out.println("Inside A");
        }
    }
    public void display();
}

Bここでは、インターフェイスとネストされたクラスを宣言しますBclass

public interface B {
    class Bclass {
        int constants = 130;

        public void display() {
            System.out.println("Inside B");
        }
    }
    public void display();
}

ここでインスタンス化しますAclass

A.Aclass a = new A.Aclass();

そして、ここでインスタンス化しますBclass:

B.Bclass b = new B.Bclass();

Aclassここで、とBclassはまったく無関係な 2 つのクラスであることに注意してください。これら 2 つが共有する唯一の共通のスーパータイプはObject.

明らかに、2 つの型から継承しようとさえしない場合、多重継承の話はあり得ません。

ここでは、少なくとも 2 つのスーパータイプを含めようとします。

public class MultipleInheritance implements A, B { ... }

ただし、この型をコードに含めることは決してありません。これはmainメソッドの単なるコンテナーです。この型は、2 つのインターフェイスを実装していますが、それらから何も継承しません。2 つの異なる型 ( AclassBclass) を継承します。また、名前が同じであっても、多重継承は行われないことに注意してください。名前の衝突だけが発生します。

多重継承は厳密にはメソッド実装の継承に関するものであり、明らかに Java では実現できません。

于 2013-09-05T08:49:59.140 に答える
1

Java は、クラスの多重継承をサポートしていません。ただし、複数を実装することはできますがinterfaces、それは多重継承とは見なされません。

このリンクもたどってください。Java に複数の継承がないのに、複数のインターフェイスの実装が許可されているのはなぜですか?

于 2013-09-05T08:31:24.473 に答える
0

以下に示すように、スーパークラスを介してサブクラスのインスタンスを呼び出していないため、これは多重継承ではありません。

A a = new MultipleInheritance(); 
a.display();

これを行う場合でも、コンパイラが変数の型を検索するため、混乱はありません。これはAであり、呼び出しの有効性を確認するためのMulipleInheritanceではありません。

コンパイラが 2 つのdisplay()メソッドを持っていることについて不平を言っていない理由は、両方とも空であるため、どちらを使用するか (A または B からのもの) が問題ではないことを知っているためです。これにより、C++ のように A と B の Bean クラスの両方で発生する可能性がある混乱を回避できます。

于 2013-09-05T08:48:34.777 に答える
0

これは多重継承ではありませんが、これは同じもののシミュレーションです。Java で複数の継承を許可しない理由は、Diamond 問題でした。これは、インターフェイスの場合には発生しません。詳細については、こちらを参照 してください。

于 2013-09-05T08:43:51.930 に答える