在超类中调用父类方法

5
作为一个脑力锻炼的例子,我的一位教授给了我们以下练习,以便学习继承。我们需要找出输出结果。
//java
public class A {
    public void f() {
        System.out.println("A -> f()");
        x = x + 4;
        if (x < 15) this.f(); //the f-call
    }
    public int x = 5;
}

public class B extends A {
    @Override
    public void f() {
        System.out.println("B -> f()");
        x = x + 3;
        super.f();
    }
}

public class Main {
    public static void
    main(String[] args) {
        A a = new B();

        System.out.println("a.f()");
        a.f();
        System.out.println(a.x);
    }
}

输出结果和我期望的一样:
  • a.f()
  • B -> f()
  • A -> f()
  • B -> f()
  • A -> f()
  • 19
然而,我现在想知道:是否有一种方法可以使 A 中的 f 调用 A 中的 f 方法,即使我从 B 对象中使用它,类似于我使用 super.f() 从 B 中调用 A 中的 f。因此,输出将变为(我认为):
  • a.f()
  • B -> f()
  • A -> f()
  • A -> f()
  • 16
这是否可能?如果可能,如何实现?
注意:我不确定这的实际应用是什么,我只是想学习一些新东西 :P

所以基本上,你想要一个方法调用自身?我认为你不能这样做。 - user4350786
是的,那正是我希望它能做的。 - The Oddler
当然,一个方法可以调用它自己,这被称为递归方法。OP的问题是是否可能在父类中指定方法的父版本。 - shmosel
@shmosel - 啊,抱歉!现在我明白了。 - user4350786
2个回答

5
简短的答案是“不行”。
更长的答案是,允许这样做会破坏关于继承的所有保证。你的B类基本上已经说过:“我现在提供了public void f()的规范方法”。因为B提供了该方法,所以它可以回调到父类中使用它(这是非常有用的事情)。
如果允许A做同样的事情,那么它实际上就绕过了B想要覆盖的行为。
有各种模式可用,可以给您类似的行为,例如模板模式

2
由于多态性将适用于超类对象的所有方法,所以被调用的f方法将始终是对象的运行时类型,即B。因此,将始终调用Bf方法,在Java中无法更改。
您可以通过在A中执行private方法(例如foo)中的f方法的工作来解决这个问题,以便在调用f时重复调用foo
public void f()
{
   foo();
}

private void foo() {
    System.out.println("A -> f()");  // Lie.
    x = x + 4;
    if (x < 15) this.foo(); //the "f"-call
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接