今天我无意中在子类中调用了错误的重载超级方法:
public class Test {
public static class A {
void foo(int p) {
// Do something...
}
void foo() {
foo(-1);
}
}
public static class B extends A {
@Override
void foo(int p) {
super.foo(); // Intended to call super.foo(p), but lost a parameter here
// Do something more...
}
}
}
运行此程序时,它会站立一段时间,然后用java.lang.StackOverflowError
对我大喊大叫。
我发现了问题并修复了它,但我无法理解为什么允许这样做。
此外,我将super.foo();
调用更改为super.equals("");
,代码仍然可以编译并成功运行。
那么为什么允许超级调用调用其他方法呢?我无法想象这样一个用例,并且无法通过Google搜索找到任何有用的信息。所以我认为这应该被视为错误?
答案 0 :(得分:1)
那么为什么允许超级调用调用其他方法?
因为您的代码可能需要这样做。实际上,它与调用同一类定义的其他方法的方法没有什么不同。请记住,超类的方法是当前实例的一部分。继承是大规模紧密耦合的。因此,可以使用超类的任何非private
成员,因为它是实例的一部分而不是从子类隐藏。 (private
成员仍然是实例的一部分,但是除非你[ab]使用反射来公开它们,否则它们将从子类中隐藏。)
值得注意的是,这与嵌套类没有任何关系;对于顶级课程也是如此。