簡體   English   中英

使用多態時如何選擇調用什么方法

[英]How to choice what method should be called when use polymorphism

我需要一種方法來選擇應該調用誰的方法。

我正在調用一個使用“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() 調用”

正如你所覆蓋的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";
   }
}

您可以看到以下過程:

-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 ),因此將調用Bm2 您只能調用super.m2()來實現您想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM