Java:main-class中的递归调用subclass-method而不是它自己的方法

Sne*_*ods 7 java recursion subclass mainclass

例:

class MainClass {
    public doIt() {
        ...
        else doIt();
    }
}

class SubClass extends MainClass {
    @Override
    public doIt() {
        super.doIt();
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是:

  • 我叫SubClass.doIt()
  • 调用MainClass.doIt()
  • MainClass.doIt()使递归调用doIt()
    但是:调用SubClass.doIt()而不是MainClass.doIt()

这是非常奇怪的行为,编程问题!我试图用this.doIt()调用递归,但这没有帮助.有人有想法吗?

非常感谢您的回答,这个问题已经解决了.

Wil*_*sem 7

这是假设的行为,通过不设置方法final,这意味着它可以是overriden,所以你必须始终考虑到有人可以做到这一点.对该方法的调用永远不会保证是该级别的方法.

但是,您可以使用(protected)final方法优雅地解决此问题:

class MainClass {

    protected final void innerDoIt () { //final: so no @Override
        ...
        else innerDoIt();
    }

    public void doIt() {
        innerDoIt();
    }

}
Run Code Online (Sandbox Code Playgroud)

然后:

class SubClass extends MainClass {

    @Override
    public doIt() {
        super.doIt();
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

final确保,该方法不能被覆盖.所以在那一刻,你有一个合同(保证),innerDoIt方法确实是innerDoIt你认为的方法.

因此,如果您不希望调用者被覆盖,只需将其对冲为另一种final方法即可.通过制作它protected,该方法也可以被调用SubClass.