[英]Java Interfaces — why not have private methods?
為什么接口上的方法總是公開的? 他們為什么不能私下?
因為接口上的所有方法都是公共的。 這就是擁有界面的重點 - 從技術上講,它為您的類定義了一個合同(可能有許多重疊的合同/接口)。 您的類的客戶端應該擁有對該接口的引用,並且只能通過該接口訪問類的已發布(公共)方法。
我推斷你指的是這樣聲明的接口:
public interface MyInter
{
public void myFunc();
}
如果省略實現中的public
限定符,則會產生錯誤:
MyClass.java:3: myFunc() in MyClass cannot implement myFunc() in MyInter; attempting to assign weaker access privileges; was public
void myFunc(){}
^
假設您可以將myFunc
私有。 您在不同的類中編寫以下代碼。 這應該抱怨您嘗試使用您無權訪問的私有函數:
MyClass foo = new MyClass();
foo.myFunc(); // Declared private, can't call it.
但是這個怎么樣:
void doSomething(MyInter foo)
{
foo.myFunc(); // Declared public in interface, private in implementation.
}
我們可以這樣做嗎? 根據界面,它是一種公共方法,所以我們應該好好去。 但它是作為一個私有方法實現的,所以該類期望永遠不會從外部調用它,這是一個應該由編譯器強制執行的限制。 但是編譯器甚至不需要了解MyClass
來編譯它。 它甚至無法編寫,或者在可能會或可能不會集成的外部庫中。
允許實現在允許訪問的規則中創建內部不一致,並且解決該不一致是完全不允許這種情況。 任何可以在接口中調用方法的東西都必須能夠在任何實現中調用它。
對於重寫子類方法,同樣的論點也適用。 你不能通過覆蓋更嚴格的限定符來“隱藏”它們。
為什么會這樣?
因為JLS這樣說:
在關於接口聲明的章節中, JLS 9.4說: “接口主體中的每個方法聲明都是隱式public
。”
在關於類聲明的章節中, JLS 8.4.8.3說: “覆蓋或隱藏方法的訪問修飾符(第6.6節)必須至少提供與重寫或隱藏方法一樣多的訪問權限,......”
工程師Dollery的答案解釋了為什么語言是這樣設計的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.