Java 从超类中调用超方法

Java 从超类中调用超方法,java,Java,作为一个脑筋急转弯的例子,我的一位教授给我们做了以下练习,学习遗传。我们必须计算出输出量 //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 exten

作为一个脑筋急转弯的例子,我的一位教授给我们做了以下练习,学习遗传。我们必须计算出输出量

//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);
    }
}
//java
公共A类{
公共空间f(){
System.out.println(“A->f()”;
x=x+4;
如果(x<15)this.f();//f调用
}
公共整数x=5;
}
公共类B扩展了A{
@凌驾
公共空间f(){
System.out.println(“B->f()”;
x=x+3;
super.f();
}
}
公共班机{
公共静态空间
main(字符串[]args){
A=新的B();
System.out.println(“a.f()”);
a、 f();
系统输出打印项次(a.x);
}
}
正如我所预料的那样,结果是

  • a、 f()
  • B->f()
  • A->f()
  • B->f()
  • A->f()
  • 十九,
然而,我现在想知道。有没有一种方法可以使a中的f调用成为a中的f方法,即使我从B对象使用它,这与我使用super.f()从B中的a调用f的方法类似。因此,输出将变成(我认为):

  • a、 f()
  • B->f()
  • A->f()
  • A->f()
  • 十六,
这可能吗?如果是,怎么做

注意:我不确定这项技术的实际应用是什么,我只是想学习一些新的东西:简单的回答是“不”,你不能这么做

更长期的答案是,允许这样做会破坏关于继承的各种保证。您的B类本质上说“我现在为
public void f()
提供规范方法”。因为
B
提供了上述方法,所以允许它回调父级以使用该方法(这是一件非常有用的事情)

如果
A
被允许做同样的事情,那么它实际上就是绕过
B
想要覆盖的行为


有各种各样的模式可以提供类似的行为,例如,

因为多态性将应用于超类对象的所有方法,所以调用的
f
将始终是对象的运行时类型——在本例中,
B
,因此将始终调用
B
f
方法。这在Java中是无法更改的

您可以通过在
private
方法中执行
A
f
方法来解决这个问题,例如,
foo
,这样当调用
f
时,
foo
会被重复调用。在
A
中:

public void f()
{
   foo();
}

private void foo() {
    System.out.println("A -> f()");  // Lie.
    x = x + 4;
    if (x < 15) this.foo(); //the "f"-call
}
public void f()
{
foo();
}
私人文件{
System.out.println(“A->f()”;//Lie。
x=x+4;
如果(x<15)this.foo();//调用
}

那么本质上,您想要一个方法来调用自己?我不认为你能做到。是的,这正是我想要它做到的。@charleswitfield当然一个方法可以自己调用它自己。这叫做递归方法。OP的问题是是否可以从父类中指定方法的父版本。@shmosel-啊,对不起!现在,我明白了。