【问题标题】:How to choice what method should be called when use polymorphism使用多态时如何选择调用什么方法
【发布时间】:2019-02-13 07:30:40
【问题描述】:

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

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

【问题讨论】:

  • 你为什么使用静态类?
  • 你的主要方法在哪个类?为什么你的两个类都是静态的?
  • 它们可能是另一个类中的嵌套类。无论如何,你不能这样做,除非你在B 中创建一个调用super.m2() 的方法。否则它会破坏覆盖方法的意义。

标签: java polymorphism hierarchy


【解决方案1】:

由于您已经在 B 中覆盖了 m2(),那么让 A.m2() 运行而不是 B.m2() 运行的唯一方法是在 B.m2() 中调用 super.m2()。 p>

即使您在B.m3() 中调用super.m1();,在A.m1() 中调用this.m2() 仍然会导致被覆盖的B.m2() 运行。

如果您不想在B.m2() 中包含super.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";
   }
}

【讨论】:

  • 当然,您可以在m2() 中调用anotherM2(),以免重复自己。
【解决方案2】:

要实现你想要的,你需要在B.m3中调用super.m2()

调用super.m1() 不起作用,因为A.m1 调用this.m2()this 是运行时类型B(您从未创建过A 对象,因此它不能是运行时类型A),因此将调用B 中的m2。你只能调用super.m2()来实现你想要的。

【讨论】:

    【解决方案3】:

    可以看到如下流程:

    -B.m3 做 super.m1 是什么意思 A.m1

    -A.m1 执行 this.m2,这是 B,因此 B.m2 被调用

    【讨论】:

    • “删除 static 关键字后”如果嵌套类不需要引用封闭类的实例,则将它们设为静态是完全合适的(也是可取的)。
    • 在您看不到嵌套类之前,该问题已被编辑。我也更新了我的答案
    猜你喜欢
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    相关资源
    最近更新 更多