0

インターフェイスを作成すると、 やwoodなどの多くのオブジェクトによって実装されます。oakpine

これを作成すると:

Pine tree = new Pine();
Oak trunk = new Oak();

ArrayList<wood> woods = ArrayList<wood>();

woods.add(tree);
woods.add(trunk);

そしてそれを次のように使用します:

for(wood tree: woods){
    if(tree.gettype() == PINE)
         tree.getbranch();
    else if(tree.gettype() == OAK)
         tree.gettrunk();
}

tree オブジェクトは Oak または Pine オブジェクト内のメソッドを使用しますか?

テストに基づいて、それぞれのオブジェクトを使用すると思いますが、確認したいだけです。

4

5 に答える 5

3

何かを上向きにキャストして、それらのインターフェース型にキャストするときはいつでも、そのインターフェースによって定義されたメソッドのみを使用できます。

Oakつまり、およびで定義されているより特殊化されたメソッドは使用できませんPinewood定義されているものだけを使用できます。
したがって、OakおよびPineで定義されているメソッドを使用する場合は、それらのオブジェクトを適切なクラス型にキャストする必要があります。

これ:

for(wood tree: woods){
    if(tree.gettype() == PINE)
         tree.getbranch();
    else if(tree.gettype() == OAK)
         tree.gettrunk();
}  

次のものに置き換える必要があります。

for(wood tree : woods){
    if(wood.getClass().getName().equals("Pine")){
        // chop that tree ! destroy nature !
    }else if(wood.getClass().getName().equals("Oak")){
        // more deforestation !
    }
}
于 2013-10-19T16:41:36.577 に答える
1

tree オブジェクトは Oak または Pine オブジェクト内のメソッドを使用しますか?

はい。たとえば、またはでgetbranchがオーバーライドされた場合、バージョンではなく、反復されるオブジェクトのバージョンが呼び出されます。したがって、 を見ていると、のバージョンが呼び出されます。を見ていると、のバージョンが呼び出されます。これは動的バインディングと呼ばれ、Java が持つ唯一の種類のバインディングです。(C++ などの一部の言語では、メソッドの宣言方法に応じて動的バインディングと静的バインディングの両方が使用されます。Java では、最も近いのはキーワードであり、メソッドをまったくオーバーライドできません [したがって、静的バインディングが許可されます。 HotSpot Just-In-Time コンパイラーが実行できる最適化など、関連するコンパイラー])。OakPinewoodOakOakPinePinefinal


補足:

  1. Java で圧倒的に多いのは、クラス名を大文字にすることです。さらに重要なのは一貫性です。したがって、OakPineクラスがある場合、それらの基本クラスはWoodではなくである必要がありwoodます。

  2. 同様に、キャメルケースはメソッド (so, getBranch, not getbranch) に使用されます。

繰り返しますが、これは慣習であり、無視することを選択できますが、他の人と通信する場合 (たとえば、SO でここで!)、次の慣習は役立ちます。

于 2013-10-19T16:40:28.823 に答える