【发布时间】:2015-10-27 12:57:11
【问题描述】:
根据规则,在覆盖子类中的方法时,参数不能更改,并且必须与超类中的相同。 如果我们在覆盖方法时传递参数的子类怎么办? 会被称为重载还是覆盖?
根据我的查询,我在下面编写了一些代码。
我期待输出为“狗吃肉食”,但令我惊讶的是输出是“动物吃肉食”
如果有人能解释当分配的对象是 Dog 类型时如何调用 Animal 方法,将不胜感激?
class Food {
public String toString(){
return "Normal Food";
}
}
class Flesh extends Food {
public String toString(){
return "Flesh Food";
}
}
class Animal {
public void eat(Food food){
System.out.println("Animal eats "+ food);
}
}
class Dog extends Animal{
public void eat(Flesh flesh){
System.out.println("Dog eats "+ flesh);
}
}
public class MyUtil {
public static void main(String[] args) {
Animal animal = new Dog();
Flesh flesh = new Flesh();
animal.eat(flesh);
}
}
【问题讨论】:
-
您已经编写了代码 - 尝试一下,看看编译器是怎么说的。
-
参见“访问者模式”
-
编译器不会抱怨任何事情。实际上程序运行这就是为什么我能够看到输出但它很奇怪。如果我将该方法显式注释为@Override,编译器会抱怨,这意味着它没有被覆盖。你也会感到惊讶。只需在你的eclipse中复制代码,猜测输出,然后执行并验证实际输出。
-
如果我在你的代码中使用
animal.eat(new Food());,你希望发生什么?为什么?
标签: java overloading overriding