在编写重写方法时,为什么在Java中允许调用另一个超类方法?

时间:2017-01-02 10:39:09

标签: java

今天我无意中在子类中调用了错误的重载超级方法:

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搜索找到任何有用的信息。所以我认为这应该被视为错误?

1 个答案:

答案 0 :(得分:1)

  

那么为什么允许超级调用调用其他方法?

因为您的代码可能需要这样做。实际上,它与调用同一类定义的其他方法的方法没有什么不同。请记住,超类的方法是当前实例的一部分。继承是大规模紧密耦合的。因此,可以使用超类的任何非private成员,因为它是实例的一部分而不是从子类隐藏。 (private成员仍然是实例的一部分,但是除非你[ab]使用反射来公开它们,否则它们将从子类中隐藏。)

值得注意的是,这与嵌套类没有任何关系;对于顶级课程也是如此。