具有相同名称调用的非覆盖子类方法

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)

在上面的代码中,输出将是

动物吃动物
狗吃狗

为什么会这样?

Mat*_*att 5

可能你期待看到两次“狗吃狗”。这不会发生,因为这两种方法具有不同的签名。因此,Dog#eat(Dog)不会覆盖Animal#eat(Animal)而是提供更具体的eat方法。

如果添加@Overridevoid 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)