gpt4 book ai didi

java - 同名调用的非覆盖子类方法

转载 作者:行者123 更新时间:2023-12-04 00:49:13 25 4
gpt4 key购买 nike

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

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

animal eats animal
dog eats dog

为什么会这样?

最佳答案

您可能希望看到两次“dog eats dog”。这不会发生,因为这两种方法具有不同的签名。因此,Dog#eat(Dog) 并没有覆盖 Animal#eat(Animal),而是提供了一个更具体的 eat 方法。

如果在void eat(Dog dog)中加上@Override,就会报错。使用此注解是一种很好的做法,因为它表示被注解的方法应该覆盖父类(super class)型中的方法声明。如果该方法不这样做(如在您的示例中),您会收到以下错误以提醒您:

Method does not override method from its superclass


如果要覆盖Dog中的eat方法,需要提供相同的签名:

@Override
void eat(Animal animal) { // instead of eat(Dog dog)
System.out.println("dog eats dog");
}

关于java - 同名调用的非覆盖子类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67860406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com