如果我将子类强制转换为其超类,并调用在子类中重写的方法,它是否执行重写或原始方法?

时间:2012-05-23 14:49:59

标签: java oop inheritance casting

考虑:

DogAnimal的子类,Dog会覆盖Animal.eat()

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

如果Animal.eat()Dog.eat()覆盖,则在从Animal类型的标识符调用方法时调用哪一个(animals[i]?)

5 个答案:

答案 0 :(得分:9)

将调用子类方法。这就是polymorphism的美丽。

答案 1 :(得分:2)

子类将是唯一的方法调用,除非子类像这样调用超类:

class Dog {
  public eat() {
     super.eat();
  }
}

答案 2 :(得分: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()); 
  }
}

你有一只定义了另一种方法的猫:

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);

这将打印“只吃一只可爱的老鼠”,而不是“抓住一只小鼠!”。为什么?因为多态只适用于方法调用中点左侧的对象。

答案 3 :(得分:1)

它将调用子类中的版本。

如果你不能传递一个子类化的对象作为其超类而不是获得子类方法,那么继承将毫无用处!

答案 4 :(得分:0)

A 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");
    }
    }

}