在更改子 class 方法签名时使用 @Override 注释
Using @Override annotation when child class method signature is changed
因此,我试图更好地了解 Java 覆盖的工作原理。
我创建了这个基本代码:
public class A {
public void foo(String s) {
System.out.println("inside A");
}
}
public class B extends A{
public void foo(String s, String g) {
super.foo(s);
System.out.println("inside B");
}
}
此代码编译良好,虽然子方法的签名不同(2 个参数而不是一个),但使用 super
不会导致任何错误。在我看来,这意味着编译器将此理解为重写方法。
然而,当我在 class B
中的 foo
方法上添加 @Override
注释时,出现编译错误:
java: method does not override or implement a method from a supertype
好像我的覆盖尝试不再正确了。
所以我有点困惑为什么会这样,以及当我添加注释时会发生什么变化。
“编译器将此理解为重写方法” - 不正确,如果签名不同,则它不是重写方法。这里使用 super
是多余的,没有 super
.
也可以正常工作
因此,我试图更好地了解 Java 覆盖的工作原理。
我创建了这个基本代码:
public class A {
public void foo(String s) {
System.out.println("inside A");
}
}
public class B extends A{
public void foo(String s, String g) {
super.foo(s);
System.out.println("inside B");
}
}
此代码编译良好,虽然子方法的签名不同(2 个参数而不是一个),但使用 super
不会导致任何错误。在我看来,这意味着编译器将此理解为重写方法。
然而,当我在 class B
中的 foo
方法上添加 @Override
注释时,出现编译错误:
java: method does not override or implement a method from a supertype
好像我的覆盖尝试不再正确了。
所以我有点困惑为什么会这样,以及当我添加注释时会发生什么变化。
“编译器将此理解为重写方法” - 不正确,如果签名不同,则它不是重写方法。这里使用 super
是多余的,没有 super
.