4

検討:

Dogは のサブクラスでありAnimalDogオーバーライドしますAnimal.eat()

Animal[] animals = getAllAnimals();
for (int i = 0; i < animals.length; i++) {
    animals[i].eat();
}

Animal.eat()によってオーバーライドされた場合、メソッドが型の識別子( ?)Dog.eat()から呼び出されたときに呼び出されるのはどれですか?Animalanimals[i]

4

5 に答える 5

9

サブクラス メソッドが呼び出されます。それがポリモーフィズムの美しさです。

于 2012-05-23T14:52:28.343 に答える
2

コード

Animal a = new Dog();
a.eat();

Dogのeatメソッドを呼び出します。しかし、注意してください!あなたが持っていた場合

class Animal {
  public void eat(Animal victim) { 
    System.out.println("Just ate a cute " + victim.getClass().getSimpleName()); 
  }
}

追加のメソッドを定義するCatがあります。

class Cat extends Animal {
  public void eat(Mouse m) { System.out.println("Grabbed a MOUSE!"); }
}

そして、あなたはそれらを使用します:

Animal cat = new Cat();
Animal mouse = new Mouse();
cat.eat(mouse);

これは、「マウスをつかんだ!」ではなく、「かわいいマウスを食べただけ」と表示されます。なんで?ポリモーフィズムは、メソッド呼び出しのドットの左側にあるオブジェクトに対してのみ機能するためです。

于 2012-05-23T15:00:02.060 に答える
2

サブクラスが次のようにスーパークラスを呼び出さない限り、サブクラスは唯一のメソッド呼び出しになります。

class Dog {
  public eat() {
     super.eat();
  }
}
于 2012-05-23T14:53:36.440 に答える
1

サブクラスでバージョンを呼び出します。

サブクラス化されたオブジェクト キャストをそのスーパークラスとして渡すことができず、サブクラス化されたメソッドを取得できない場合、継承はまったく役に立ちません。

于 2012-05-23T14:53:32.587 に答える
0

sscce _

/**
 * @author fpuga http://conocimientoabierto.es
 * 
 * Inheritance test for http://stackoverflow.com/questions/10722447/
 *
 */


public class InheritanceTest {

    public static void main(String[] args) {
    Animal animals[] = new Animal[2];
    animals[0] = new Animal();
    animals[1] = new Dog();

    for (int i = 0; i < animals.length; i++) {
        animals[i].eat();

        if (animals[i] instanceof Dog) {
        System.out.println("!!Its a dog instance!!");
        ((Dog) animals[i]).eat();
        }
    }

    }


    private static class Animal {
    public void eat() {
        System.out.println("I'm an animal");
    }
    }

    private static class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("I'm dog");
    }
    }

}
于 2012-05-23T15:07:35.527 に答える