2011-01-26 41 views
27

Java tutorial "Defining an Interface",它說Java教程說,我可以有一個包專用接口,但我不能

如果不指定該接口是public,你的界面將只能訪問在與接口相同的包中定義的類。

然而,這

interface PPInterface { 
    void foo(); 
    void bar(); 
} 

class NewClass implements PPInterface { 
    void foo() {} 
    void bar() {} 
} 

NewClass產生是因爲我「嘗試分配較弱的訪問權限編譯器錯誤;是公開的「。所以文檔是錯誤的,或者我做錯了什麼,或者我誤解了文檔?

我想我不需要使用接口 - 我喜歡它,因爲它保持了很好的組織。

回答

48

接口本身可以是包私有的,而不是其中的方法。您可以定義一個只能在其定義的包中使用(按名稱)的接口,但其方法與所有接口方法類似,都是public10。如果一個類實現了該接口,它定義的方法必須是public。這裏最關鍵的是它的接口型號在包裝外面不可見,而不是方法。文檔沒有錯誤,因爲使用界面中定義的方法與使用界面本身不一樣。

另請注意,在定義接口時,在方法定義不會改變任何內容之前不添加public,因爲這些方法都是隱式的public

如果您實現接口的類本身是包私有的,那麼接口方法的顯然性不是問題。當然,你也可以使用抽象類而不是接口,如果單繼承問題不會妨礙你:

abstract class Whatever { 
    abstract void foo(); 
    abstract void bar(); 
} 
4

認爲(儘管我可能是錯誤的這一點),其正在這裏討論的較弱的訪問權限是在NewClassfoo()bar()方法。所有接口方法都隱含地爲public,但在NewClass中,您已將它們保留爲包私有,這是比public更弱的保證。更改NewClass閱讀

class NewClass implements PPInterface{ 
    public void foo() {} 
    public void bar() {} 
} 

可能會解決這個問題。

+0

確實......但我不想修復它..我希望他們是封裝私有的。文檔很清楚你可以這樣做,所以文檔是錯誤的?或者這意味着只有包中的對象可以實現接口,但方法仍然是公共的? (我想這就是答案) – Pete 2011-01-26 05:36:11

+3

@ Pete-我認爲這裏有兩個單獨的問題。通過保留接口package-private,唯一可以引用該接口的類必須位於同一個包中。但是,由該接口定義的方法是隱式公開的,因此任何實現該接口的類都必須具有標記爲private的那些特定函數。所以不,文檔沒有錯誤 - 只有兩個獨立的可見性級別。 – templatetypedef 2011-01-26 05:38:19

相關問題