[英]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
的類型main1
為Main1
將導致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.