Tac*_*Tac 3 java oop polymorphism inheritance
class Animal{
void eat(Animal animal){
System.out.println("animal eats animal");
}
}
public class Dog extends Animal{
void eat(Dog dog){
System.out.println("dog eats dog");
}
public static void main(String[] args) {
Animal a = new Dog();
Dog b = new Dog();
a.eat(b);
b.eat(b);
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,输出将是
动物吃动物
狗吃狗
为什么会这样?
可能你期待看到两次“狗吃狗”。这不会发生,因为这两种方法具有不同的签名。因此,Dog#eat(Dog)不会覆盖Animal#eat(Animal)而是提供更具体的eat方法。
如果添加@Override到void eat(Dog dog)会有错误。使用此批注是一种很好的做法,因为它表示带批注的方法应该覆盖超类型中的方法声明。如果该方法不这样做(如您的示例中所示),您会收到以下错误,让您知道它是否:
方法不会覆盖其超类中的方法
如果要覆盖 中的eat方法Dog,则需要提供相同的签名:
@Override
void eat(Animal animal) { // instead of eat(Dog dog)
System.out.println("dog eats dog");
}
Run Code Online (Sandbox Code Playgroud)