2016-05-04 12 views
-5

ビルドしてインターフェイスするとき、インターフェイスを実装できるクラスの数はいくつですか?
答えが複数の場合、javaはインターフェイスへの呼び出し時(実装を直接呼び出さない)にどの実装を使用するかをどのように知っていますか?Javaインターフェイスの概念

+3

Javaにどの実装を使用すべきかを教えてください! – user2004685

+0

あなたが 'import'を使うときは、どの実装を使うべきかをJavaに伝えます。 – MaxG

+0

無制限の数では、インターフェイスを実装し、参照を設定するときに具体的な型を指定することができます。 –

答えて

0

インターフェイスを実装できるクラスの数はいくつですか?

必要なだけ多く

答えが複数の場合、Javaはインターフェイスへの呼び出し時(実装を直接呼び出さない)にどの実装を使用するかをどのように知っていますか?

ここでは、late binding(動的バインディングとも呼ばれます)についての知識が役立ちます。

あなたが表示されます

Animal a1 = new Cat(); 
Animal a2 = new Dog(); 

a1.makeSound(); 
a2.makeSound(); 

結果は、それが起こる

mew 
woof 

であるように、あなたはまた、コードを持って

interface Animal{ 
    void makeSound(); 
} 

class Cat implements Animal{ 
    public void makeSound(){ 
     System.out.println("mew"); 
    } 
} 

class Dog implements Animal{ 
    public void makeSound(){ 
     System.out.println("woof"); 
    } 
} 

のようにそれを実装するインタフェースとクラスをしていると言うことができますボディ/コードの方法.makeSound()が実行時に(コンパイル時ではない)が検索されている(呼び出されている)。各オブジェクトがそのクラスを覚えているので、a1が保持するオブジェクトがCatのインスタンスであり、a2が保持するオブジェクトがDogのインスタンスであることが分かるため、可能です。

だから、要するにあなたが行うとき:

a1.makeSound(); 
  • JVMは、そのクラスについてそのオブジェクトを要求し、その後
  • a1が保持するオブジェクトを受け取り(この場合には、それはそれはCatのインスタンスであることを学びます。クラスCat.classファイル)にアクセスし、makeSound()のコードを探しています(そのようなメソッドが見つからない場合、継承されている必要があるとみなされます)。スーパークラスでそれを調べる)
  • このメソッドが見つかると、そこからコードが呼び出されます。
+0

非常によく言った。ありがとうございました。 – MarkoRocko

+0

@MarkoRocko大歓迎です。私は、Javaで多形性を持つこのメカニズムのおかげで、それを追加することを忘れてしまった。また、 '.someMethod()'を呼び出すときに動的バインディングから3つの例外があります。コンパイル時にコードが設定され、実行時に動的に検索されない場合の最初の例外は、メソッドが 'final'のときです(実行時に*検索*するためのポイントがオーバーライドされないためです)。第2のケースは、メソッドが 'private'の場合です(プライベートメソッドは他のクラスのプライベートメソッドを宣言してアクセスすることは不可能です)。 – Pshemo

+0

@MarkoRocko第3のケースは、 'reference.staticMethod()'がコンパイル時に 'ReferenceType.staticMethod()'に変更されたため、メソッドがstaticの場合です。 – Pshemo