簡體   English   中英

Java私有方法覆蓋

[英]Java private method override

我遇到了這種情況。 我們有一個類讓我們說主要有私人方法打印。 另一個類Main1擴展了Main類並重新定義了print方法。 由於main1是Main1類的對象,我希望調用main1 print方法...

public class Main {
    public static void main(String[] args) {
       Main main1 = new Main1();
       List<String> list = new ArrayList<String>();
       main1.print(list);
    }

    private void print(List<String> string) {
       System.out.println("main");
    }

}

class Main1 extends Main {
    public void print(List<String> string) {
       System.out.println("main1");
    }
}

在這種情況下,當我們運行程序時,它會打印“main”。 它真的讓我感到困惑,因為該方法是私有的,甚至不是Main1類的一部分。

答案並不太難:

  • main1變量的類型Main不是 Main1
  • 所以你只能調用那種類型的方法
  • 唯一可能的方法叫做print ,它接受Main上的List<String>是私有方法
  • 調用代碼在Main類中,因此它可以調用該類中的私有方法

因此將調用Main.print(List<String>)

請注意,將main1的類型main1Main1將導致Main1 另一個 print(List<String>)方法。

如果您希望能夠覆蓋您的print方法,則必須將其聲明為public

public class Main {

   public void print(List<String> string) {
   }

}

否則,它將調用您的私有方法,而不在派生類中查找實現。

不繼承私有方法,並且代碼中不會發生方法重寫。 您可以通過在Main1.print()方法中放置@Override注釋來看到這一點。 如果您放置該注釋,則生成編譯錯誤。

Main.java:17: method does not override or implement a method from a supertype
        @Override
        ^
1 error

在您的情況下,Main1.print()和Main.print()是不同的,彼此不相關(沒有覆蓋,沒有重載)。 因此,如果將main1指定為Main,則將調用Main.print()。 如果將main1指定為Main1,則將調用Main1.print()。

你的main1是一種Main類型,但實例化為Main1! 沒關系,因為它是Main的子類。 但是,當你調用print方法(BTW,它應該是main1.print(list);)時,它將調用Main類中的private方法! 如果將方法的可見性更改為protected或public,則在這種情況下,將調用Main1類中的print方法,因為實例化對象的多態行為(請記住,它畢竟是基於您的代碼的Main1對象)提供了!)

暫無
暫無

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

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