使用多态时如何选择调用什么方法
How to choice what method should be called when use polymorphism
我需要一种方法来选择应该调用谁的方法。
我正在调用一个父方法,该方法使用 "this" 调用其中一个方法。问题是我在我的 class 中重写了那个方法,所以当调用父方法时,它会调用我的方法而不是它的方法。
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() called",但实际输出是"B.m2() called"
可以看到如下流程:
-B.m3做super.m1是什么意思A.m1
-A.m1 执行 this.m2,这里是 B,因此 B.m2 被调用
为了达到你想要的效果,你需要在B.m3
中调用super.m2()
。
调用 super.m1()
无效,因为 A.m1
调用了 this.m2()
。 this
是运行时类型 B
(您从未创建过 A
对象,所以它不可能是运行时类型 A
),所以 m2
在B
将被调用。你只能调用super.m2()
来实现你想要的。
由于您已经在 B
中覆盖了 m2()
,因此将 A.m2()
变为 运行 而不是 B.m2()
的唯一方法是调用 super.m2()
里面 B.m2()
.
即使您在 B.m3()
中调用 super.m1();
,在 A.m1()
中调用 this.m2()
仍然会导致覆盖 B.m2()
到 运行.
如果您不想在 B.m2()
中使用 super.m2()
(或者在所有情况下都不想这样),那么唯一的选择是创建一个您不需要的不同方法t 在 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";
}
}
我需要一种方法来选择应该调用谁的方法。
我正在调用一个父方法,该方法使用 "this" 调用其中一个方法。问题是我在我的 class 中重写了那个方法,所以当调用父方法时,它会调用我的方法而不是它的方法。
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() called",但实际输出是"B.m2() called"
可以看到如下流程:
-B.m3做super.m1是什么意思A.m1
-A.m1 执行 this.m2,这里是 B,因此 B.m2 被调用
为了达到你想要的效果,你需要在B.m3
中调用super.m2()
。
调用 super.m1()
无效,因为 A.m1
调用了 this.m2()
。 this
是运行时类型 B
(您从未创建过 A
对象,所以它不可能是运行时类型 A
),所以 m2
在B
将被调用。你只能调用super.m2()
来实现你想要的。
由于您已经在 B
中覆盖了 m2()
,因此将 A.m2()
变为 运行 而不是 B.m2()
的唯一方法是调用 super.m2()
里面 B.m2()
.
即使您在 B.m3()
中调用 super.m1();
,在 A.m1()
中调用 this.m2()
仍然会导致覆盖 B.m2()
到 运行.
如果您不想在 B.m2()
中使用 super.m2()
(或者在所有情况下都不想这样),那么唯一的选择是创建一个您不需要的不同方法t 在 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";
}
}