考虑:
Dog
是 的子类Animal
,并且Dog
覆盖Animal.eat()
Animal[] animals = getAllAnimals();
for (int i = 0; i < animals.length; i++) {
animals[i].eat();
}
IfAnimal.eat()
被 覆盖,当从类型( ?)Dog.eat()
的标识符调用方法时调用哪一个Animal
animals[i]
考虑:
Dog
是 的子类Animal
,并且Dog
覆盖Animal.eat()
Animal[] animals = getAllAnimals();
for (int i = 0; i < animals.length; i++) {
animals[i].eat();
}
IfAnimal.eat()
被 覆盖,当从类型( ?)Dog.eat()
的标识符调用方法时调用哪一个Animal
animals[i]
将调用子类方法。这就是多态的美妙之处。
子类将是唯一的方法调用,除非子类像这样调用超类:
class Dog {
public eat() {
super.eat();
}
}
编码
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);
这将打印“刚吃了一只可爱的老鼠”,而不是“抓住了一只老鼠!”。为什么?因为多态性仅适用于方法调用中点左侧的对象。
它将调用子类中的版本。
如果你不能传递一个子类对象作为它的超类并且没有得到子类方法,那么继承将毫无用处!
一个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");
}
}
}