[英]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();
...
}
}
现在的问题是:
这是非常奇怪的行为,编程问题! 我试图用this.doIt()调用递归,但这没有帮助。 有人有想法吗?
非常感谢您的回答,这个问题已经解决了。
这是假设的行为,通过不设置方法final
,这意味着它可以override
n,所以你必须始终考虑到有人可以做到这一点。 对该方法的调用永远不会保证是该级别的方法。
但是,您可以使用( 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
调用。
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");
}
}
}
在这个例子中, b
和a
都是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.