下面的代码破坏了什么OO原则?不是 Java OO 原则,而是一般 OO 原则。
class GeneralArg{}
class Arg extends GeneralArg{}
class A{
public void test(Arg a){}
}
class B extends A{
@Override
public void test(GeneralArg a){}
}
我认为这应该可行!
但是有一个编译错误说 B.test()
没有覆盖 A.test()
最佳答案
您正在做的不是覆盖而是重载。
当你改变参数列表时你重载了一个方法。 当你改变它的实现时,你会覆盖一个方法。
public class Foo {
public void method1() {
}
public void method1(String str) {
//We overload method1
}
}
public class Bar extends Foo {
public void method1(String str) {
// We override method1 here
}
public void method1(Number num) {
// We overload method1 here
}
}
请注意,注释不是强制性的,它只会通知编译器您已覆盖某些方法以防止潜在的错误。
当您在子类中声明具有相同 [签名] 的方法时,您会结束它,当您添加/删除开关参数顺序时,您会重载。该规则遵循 Java 世界,因为每个非 final方法都是虚拟的,并且可以被覆盖。
关于java - Java中覆盖方法的更广泛的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18337056/