Java: main-class 中的递归调用子class-方法而不是它自己的方法
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,因此您必须始终考虑到有人可以这样做。对该方法的调用 永远不会保证 调用该级别的方法。
不过,您可以使用 (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
都是 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
是classB
的一个实例。如果不分隔 doIt()
的内容(请参阅 CommuSoft 的回答)
,则没有语法可以做您想做的事
示例:
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,因此您必须始终考虑到有人可以这样做。对该方法的调用 永远不会保证 调用该级别的方法。
不过,您可以使用 (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
都是 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
是classB
的一个实例。如果不分隔 doIt()
的内容(请参阅 CommuSoft 的回答)