我需要一种选择应该调用谁方法的方法。
我正在调用一个父方法,该父方法使用“ 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()”
答案 0 :(得分:2)
当您在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";
}
}
答案 1 :(得分:0)
您可以看到以下过程:
-B.m3做super.m1意味着A.m1
-A.m1这样做this.m2,这里是B,因此被称为B.m2
答案 2 :(得分:0)
要实现所需的功能,您需要在super.m2()
中调用B.m3
。
调用super.m1()
无效,因为A.m1
调用this.m2()
。 this
的运行时类型为B
(您从未创建过A
对象,因此它不能为运行时类型A
),因此m2
B
将被调用。您只能致电super.m2()
来实现所需的目标。