0
class Animal {

}

class Horse extends Animal {

}

public class Test {
    public static void main(){
        Animal a = new Horse();//mark1
    }
}


Animal ah = new Horse();// reference type is Animal and object is Horse

以下でこれを完全に理解することはできません: Animal ah = new Horse();//参照型は動物でオブジェクトはHorse
私は常に参照型をオブジェクトと同じに保ちます同じではないもの
を使用する理由を知りたい参照型。使用する方が適切な条件を教えてください。

4

3 に答える 3

2

これはいくつかの場面で機能します。簡単な例は、一連の動物が必要な場合です。

Animal array[] = new Animal[3];
array[0] = new Horse();
array[1] = new Cow();
array[2] = new Animal();

いくつかのジェネリックメソッドを定義することも、拡張するクラスごとにそれらを指定することもできます。

public class Cow extends Animal {
    public void sound() {
        System.out.println("MOO");
    }
}

public class Horse extends Animal {
    public void sound() {
        System.out.println("HEEEHREHE");
    }
}

動物にいる間、あなたは何をすべきかを知ることができなかったので、あなたは次のような何かを使うことができました

public class Animal {
    public void sound() {
        System.out.println(".");
    }
}

重要なのは、配列内のすべての動物を駆け巡る場合、その動物に対して定義されたメソッドを使用するということです。

for (int i = 0; i < 3; i++) {
    array[i].sound();
}

出力します:

HEEEHREHE
MOO
.
于 2012-11-28T03:28:59.070 に答える
1

プログラムの実行中に同じ変数が異なるクラスのオブジェクトを参照できるようにすることに加えて、コーディングオプションを開いたままにしておくことがよくあります。

古典的なケースは次のとおりです。

List<String> myList = new ArrayList<String>();

コンパイラは、ensureCapacityがListメソッドではないため、たとえばmyList.ensureCapacity(100)を拒否します。myListに使用できるのはListメソッドのみです。プログラムが動作して測定された後、LinkedListを使用するとプログラムが高速になることがわかった場合、コンストラクター呼び出しのみが変更されます。myListでは、どのリストでも機能しないことは何も行われていません。

于 2012-11-28T03:45:54.843 に答える
0

そのため、「ab」タイプとして動物または馬のいずれかを使用できます。この特定のケースでは、動物の種類でオブジェクトを参照することの有用性は、後の段階で、他の動物オブジェクト(動物インターフェースを実装する)などの他の動物オブジェクトをポイントしたい場合、コードの他の場所ではそうではないという事実にあります。コード内の他の場所と同様に、まだ動物タイプを変更する必要があります。したがって、インターフェイスタイプでオブジェクト参照を参照すると、実際の実装インスタンスを動的に変更する自由が得られ、実装クラスも外部から隠されます。

于 2012-11-28T03:22:36.830 に答える