问题描述
我需要一种方法来选择应该调用谁的方法。
我正在调用一个使用“this”调用其方法之一的父方法。 问题是我在我的类中覆盖了该方法,所以当调用父方法时,它会调用我的方法而不是它的方法。
public class MainTest
{
public static class A
{
public String m1()
{
return this.m2();
}
public String m2()
{
return "A.m2() called";
}
}
public static class B extends A
{
@Override
public String m1()
{
return "B.m1() called";
}
@Override
public String m2()
{
return "B.m2() called";
}
public String m3()
{
return super.m1();
}
}
public static void main(String[] args)
{
System.out.println(new B().m3());
}
}
我想实现“A.m2() 调用”,但实际输出是“B.m2() 调用”
1楼
正如你所覆盖的m2()
中B
,那么只有这样,才能A.m2()
而不是运行B.m2()
是调用super.m2()
内B.m2()
即使你正在调用super.m1();
在B.m3()
调用this.m2()
在A.m1()
将仍然导致重写B.m2()
来运行。
如果您不想在super.m2()
B.m2()
(或者在所有情况下都不想这样做),那么唯一的选择是创建一个您不在B
覆盖的不同方法(并从A.m1()
调用它 - 您可能也必须更改或创建另一个A.m1()
):
public static class A {
public String m1(){ //you may need a different method to call from B.m3()
return this.anotherM2();
}
public String m2(){
return "A.m2() called";
}
public String anotherM2() {
return "A.m2() called";
}
}
2楼
您可以看到以下过程:
-B.m3 做 super.m1 是什么意思 A.m1
-A.m1 执行 this.m2,这里是 B,因此调用 B.m2
3楼
为了实现你想要的,你需要在B.m3
调用super.m2()
。
调用super.m1()
不起作用,因为A.m1
调用this.m2()
。
this
是运行时类型B
(您从未创建过A
对象,因此它不能是运行时类型A
),因此将调用B
的m2
。
您只能调用super.m2()
来实现您想要的。