使用多态时如何选择应调用的方法

时间:2019-02-13 07:30:41

标签: java polymorphism hierarchy

我需要一种选择应该调用谁方法的方法。

我正在调用一个父方法,该父方法使用“ 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()”

3 个答案:

答案 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()来实现所需的目标。