web-dev-qa-db-ja.com

クラスまたはインターフェイスがプライベートまたは保護されたアクセス修飾子を受信できないのはなぜですか?

私はいくつかのJava=テキストを読んでおり、テキストには、クラスとインターフェイスにpublicまたはdefaultアクセス修飾子のみを適用できると書かれています。したがって、それはコンパイルです。宣言するとエラー:

private class A {}

または

protected class A{}

クラスまたはインターフェイスがprivateまたはprotectedアクセス修飾子を受信できないのはなぜですか。

36
ipkiss

privateは、「包含クラス内でのみ表示可能」を意味します。

protectedは、「包含クラスとサブクラス内、および包含クラスのパッケージ内の任意の場所でのみ可視」を意味します。

したがって、privateはトップレベルのクラスに適用しても意味がありません。 protectedの定義の最初の部分についても同様です。 protectedの2番目の部分couldが適用されますが、デフォルト(パッケージ保護)修飾子によってカバーされるため、protectedは部分的に意味がなく、部分的に冗長です。

privateprotectedはどちらもネストされたクラスとインターフェースに適用できます(頻繁に適用されます)。

54
Michael Myers

トップレベルのクラスはpublicまたはdefaultにのみアクセスできますが、内部クラスはprivate accessにアクセスできます。

public class TestClassAccess
{
    public static void main(String[] args)
    {
        new TestClassAccess().new TestClassPrivateAccess();
    }

    private class TestClassPrivateAccess
    {
        TestClassPrivateAccess()
        {
            System.out.println("I'm a private class");
        }
    }
}
15
Hunter McMillen

トップレベルでのクラス可視性の使用例は2つだけです(a)すべての場所で可視(b)パッケージ内でのみ可視。したがって、2つの修飾子(publicとデフォルト)のみです。 classがpublicの場合、すべてのクラスに表示されます。アクセス修飾子がない場合は、同じパッケージ内のクラスに対してのみ表示されます。

トップレベルでのクラスの可視性のユースケースが多かった場合、Java言語はより多くの修飾子を提供するでしょう。

5
Oak Bytes