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

时间:2015-02-19 18:58:29

标签: java recursion subclass mainclass

示例:

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()调用递归,但这没有用。 有人有想法吗?

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

2 个答案:

答案 0 :(得分:7)

这是假设的行为,通过不设置方法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方法即可。通过设置protectedSubClass也可以调用该方法。

答案 1 :(得分:1)

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的回答)