2010-12-29 12 views
14

私はInterface1というインターフェースを持っています。私はその実装Imple implements Interface1(すべてのメソッドが実装されている:) :))。インタフェースメソッドを呼び出すと、実装クラスからメソッド本体を取得して実行しますか?

Interface1 interface1; 
interface1.method(); 

必要なすべての輸入が行われている:

さて、私は以下の言及のように、私はクラスCheckCallで通話を行うことができ、第三のクラスCheckCallを検討してください。可能であれば、可能であるかどうかを教えてください。そうでなければOKです。同じインターフェイスのクラスを複数実装していて、同じ呼び出しを行っている場合、どうなるか教えてください。

答えて

14

さて、あなたは、インターフェイス上で直接メソッドを呼び出すことはできませんが、あなたは、多かれ少なかれ、書いたものを行うことができます。

あなたは書きました:私は 同じに複数のIMPLのクラスを持っている 場合はどうなるかを教えて

Interface1 interface1 = new CheckCall(); 
interface1.method(); 

:あなたがこれを行う場合

Interface1 interface1; 
interface1.method(); 

これは動作しますインターフェイスと私は 同じコールをしています

まあ、それは、Javaのいいことだ:あなたが参照している問題は、「ダイヤモンドの問題」と呼ばれている:

http://en.wikipedia.org/wiki/Diamond_problem

とJavaは完全に多重継承をサポートしているので、それは本当にJavaでは存在しません"複数(Java)インターフェース継承"(*コメントを参照)を介してのみ。

interface1.method()に電話をしたときは、Implの方法かCheckCallの方法を呼び出しているので混乱はありません。

+0

、** ANY ** OOA/OODがきれいにのみ「インターフェイスの継承」を使用してJavaでOOPに変換することができます。実際にはOOとあまり関係ない* "コードの再利用" *としても知られている*実装継承*の概念さえも持たない言語に翻訳される可能性があります。しかし、Javaが完全にMIをサポートしているということを理解していない人もいます。( – SyntaxT3rr0r

+0

あなたの答えは、あなたが明らかに下降した他のすべての回答とどのように違いますか?あなたが追加するウィキリンク –

+0

@Sean Patrick Floyd:人々はSOの答えを下降させることができますか? – SyntaxT3rr0r

0

いいえ、インタフェース自体ではなく、インタフェースを実装するオブジェクトでコールする必要があります。

編集:その型の変数は使用できますが、それでもその型を実装するクラスである必要があります。インターフェイスのインスタンスを作成することはできません。

5

はい、あなたが書いた通りではありません。

Interface1 interface1 = new Imple(); 

型の変数を作成し、それをインターフェイスを実装するクラスにインスタンス化することができます。あなたは、たとえば、Javaコレクションでかなり頻繁にこれを参照してください。

List<String> a = new ArrayList<String>(); 
0

インターフェイスをインスタンス化することはできませんとして、あなたは、Impleオブジェクトを作成する必要がありますようにそれを使用しますこのようなInterface1 1:実際には

Interface1 interface1 = new Imple(); 

interface1.method(); 

、この方法は、所与の実装を気にすることなく、それを実装する任意のオブジェクトを返す有する能力から来るインタフェースの主な関心。あなたのケースでは、それは実際には、あなたがそれらを定義していますが、実際の実装クラスを必要とするインタフェースによって方法を参照する必要があります

public class CheckCall { 
    public Interface1 factoryMethod() { 
     return new Imple(); 
    } 

    public void test() { 
     Interface1 used = factoryMethod(); 

     used.method(); 
    } 
} 
1

として現れる可能性があります。だから私は通常、このようにそれを行うだろう:

// the variable is of type Interface1 
Interface1 interface1 = new Imple(); 
// but the method will be executed on the Imple object 
interface1.method(); 
7

確かに、コードは正常に機能します。変数interface1を実際の実装(つまり、新しいImple())で初期化するだけです。

この例をチェックアウト、私はあなたのクラス名を使用:多重継承について

public class CheckCall { 

    interface Interface1 { 
     void method(); 
    } 

    static class Imple implements Interface1 { 
     @Override 
     public void method() { 
      System.out.println("Imple.method1()"); 
     } 
    } 

    public static void main(String[] args) { 
     Interface1 interface1; 
     interface1 = new Imple(); 
     interface1.method(); 
    } 

} 
関連する問題