1

Java は多重継承をサポートしないと言われていますが、複数のインターフェースを実装できます。したがって、以下のスニペットの場合、どの show() メソッドが実装されますか。

public interface I1{

   public void show();

}


public interface I2{

   public void show();

}


class mine implements I1, I2{

    @override
    public void show(){

       //do something

    }
}

私の質問は、オーバーライドされた show() メソッドをどのように知るかです。

4

4 に答える 4

3

私の質問は、オーバーライドされた show() メソッドをどのように知るかです。

これでは見分けがつきません。メソッドの実装は 1 つだけで、show()いずれかのインターフェイスから呼び出すことができます。

于 2013-04-05T13:55:11.617 に答える
3

Java には C# の に相当するものはありpublic void A.show()ません。これは、インターフェイスがそのように競合しないようにするためです。同じ名前と同じ引数の型を持つメソッドを宣言する 2 つのインターフェイスを実装する場合、それらの戻り値の型も同じであるか、Java はコードをコンパイルすることさえできません。また、戻り値の型同じになると、署名が両方のインターフェイスの要件を満たすため、どちらか一方を実装するクラスは実際には両方を同時に実装します。

もちろん、確認したい場合は...

public class Example {
    interface A { public void show(); }
    interface B { public void show(); }

    class C implements A, B {
        public void show() { System.out.println("show()ing"); }
    }

    public static void main(String[] args) {
        C c = new C();

        A a = c;
        a.show();  // does something, trust me :P

        B b = c;
        b.show();  // does something too
    }
}

Cは両方のvoid show()インターフェースのメソッド宣言を満たしているので、すべて問題なく、コンソールに 2 つの行が表示されます (1 つは A 参照による呼び出し用、もう 1 つは B 呼び出し用)。

今、あなたが持っていたとしましょう

interface A { public void show(); }
interface B { public int show(); }  <-- different return type!

class C implements A, B { public void show(); }

どのメソッドを実装しようとしているのかは、ある程度明らかです。ただし、これは機能しません。Java では 2 つのインターフェイスのメソッドが同じクラスに存在することを許可しないため、機能しません。

さて、最後の例です。

interface A { public void show(); }
interface B { public int show(int); }  <-- different return type!

class C implements A, B {
    public void show() { System.out.println("Showing..."); }
    public int show(int i) { System.out.println(i); }
}

これで十分です。2 つのインターフェイス宣言は名前のみを共有し、arg 型を共有しないため、Java はそれらを で共存させますC。ただし、インターフェイスごとに 1 つのメソッドを実装する必要もあります。

于 2013-04-05T13:57:46.223 に答える
2

インターフェイスにはメソッド定義がありません。どのインターフェイスの show メソッドをオーバーライドするかは問題ではありません。

同じメソッドを持つクラスに 2 つのインターフェイスを実装しています。どのインターフェイス メソッドがオーバーライドされますか?

型が 2 つのインターフェイスを実装し、各インターフェイスが同一のシグネチャを持つメソッドを定義する場合、実際にはメソッドは 1 つしかなく、それらを区別することはできません。たとえば、2 つのメソッドの戻り値の型が競合する場合、コンパイル エラーになります。これは、継承、メソッドのオーバーライド、隠蔽、および宣言の一般的なルールであり、継承された 2 つのインターフェイス メソッド間だけでなく、インターフェイスとスーパー クラス メソッド間の競合、またはジェネリックの型消去による競合にも適用されます。 .

于 2013-04-05T13:56:51.040 に答える
0

それはいいです。これら 2 つのインターフェイスがたまたま同じメソッド宣言を持っていることを考えてみてください。

于 2013-04-05T13:57:53.487 に答える