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()
- B->f()
- A->f()
- A->f()
- 十六,
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-啊,对不起!现在,我明白了。