7

例子:

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

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

4

2 回答 2

7

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

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

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.

于 2015-02-19T19:08:39.857 回答
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都是 class 的实例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 的回答)

于 2015-02-19T19:13:41.960 回答