簡體   English   中英

Java接口 - 為什么沒有私有方法?

[英]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.

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