2

重複の可能性:
インターフェースで保護

次のコードスニペットは、Javaのインターフェイスがパブリックである修飾子を1つだけ持つことができることを示しています。他の修飾子(プライベートおよびプロテクト)は、フィールドまたはメソッドのいずれのインターフェース内でも許可されていません。明らかに、修飾子の中で、privateはインターフェース内で使用する意味がありませんが、保護は、その実装クラスによって組み込むことができるため、インターフェース内で許可する必要があります。

interface Demo
{
    private final static int a=10; //Will not be compiled.
    protected final static int b=20; //Will not be compiled.
    public final static int x=0;   //ok

    abstract public void showSum();
}

一方、抽象クラスは、すべての修飾子をprivate、public、およびprotectedにすることができます。私の質問は、保護された修飾子が、ある程度許可されているように見えるインターフェイス内では許可されていないということだけです。なんで?

4

3 に答える 3

7

明らかに、最良の答えは「それが彼らがそれを定義した方法だからです」です。Javaが最初に定義されたときに下された決定の背後にある論理的根拠をあまりよく見ないと思います。それはずっと前のことであり、今では、言語を使用することによって得られた経験は、それらの最初の決定の多くに欠陥があることを示しています。

この場合、インターフェースはオブジェクトと通信するためのパブリックプロトコルとして機能することを目的としているため、すべてのメンバーがパブリックである必要があることが決定されました。これは最良または最も有用な定義ではなかったかもしれませんが、それは私たちが持っているものであり、私たちはそれと一緒に暮らす必要があります。

于 2011-11-06T13:51:44.150 に答える
7

内のすべてのメソッドとフィールドは、interfaceどこからでも呼び出せるように宣言する必要があります。サブクラス内からだけではありません。

publicこれを実現できるのは修飾子だけです。

ただし、インターフェイスにフィールドを含めることは避けてください。もし可能なら。

于 2011-11-06T13:51:48.067 に答える
2

抽象クラスは、サブクラスが継承するいくつかの実装を提供します。

インターフェイスは、実装を提供せずに外部APIを定義するだけです。インターフェイスの背後にある全体的な考え方は、実装は完全に実装クラスに任されているということです。

于 2011-11-06T13:50:37.003 に答える