繁体   English   中英

Java:主类中的递归调用subclass-method而不是自己的方法

[英]Java: recursion within main-class calls subclass-method instead of its own method

例:

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

class SubClass extends MainClass {
    @Override
    public doIt() {
        super.doIt();
        ...
    }
}

现在的问题是:

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

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

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

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

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

class MainClass {

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

    public void doIt() {
        innerDoIt();
    }

}

接着:

class SubClass extends MainClass {

    @Override
    public doIt() {
        super.doIt();
        ...
    }
}

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

因此,如果您不希望调用者被覆盖 ,只需将其对冲成另一种final方法。 通过使其protected ,该方法也可以由SubClass调用。

public class Main {

    public static void main(String[] args) {
        B b = new B();
        b.doIt();
        System.out.println();
        A a = new B();
        a.doIt();
    }


    public static class A{
        boolean check=false;
        public void doIt(){
            System.out.println("A start");
            if(check){

            }
            else{
                check = true;
                doIt();
            }
            System.out.println("A end");
        }
    }
    public static class B extends A{
        @Override
        public void doIt() {
            System.out.println("B start");
            super.doIt();
            System.out.println("B end");
        }
    }
}

在这个例子中, ba都是B类的实例,正如你可能期望的那样,a.doIt()和b.doIt()将输出相同的结果。

B start
A start
B start
A start
A end
B end
A end
B end

B start
A start
B start
A start
A end
B end
A end
B end

当你调用doIt() ,你隐式调用this.doIt()this是一个B类的实例。 如果不分离doIt()的内容,没有语法可以做你想做的事(参见CommuSoft的回答)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM