1. 概要

このチュートリアルでは、Javaのアクセス修飾子について説明します。これらは、クラス、変数、メソッド、およびコンストラクターへのアクセスレベルを設定するために使用されます。

簡単に言えば、4つのアクセス修飾子があります: public private protected default (キーワードなし) 。

始める前に、最上位クラスはpublicまたはdefaultアクセス修飾子のみを使用できることに注意してください。 メンバーレベルでは、4つすべてを使用できます。

2. デフォルト

キーワードを明示的に使用しない場合、Javaは、指定されたクラス、メソッド、またはプロパティへのdefaultアクセスを設定します。 デフォルトのアクセス修飾子はpackage-privateとも呼ばれます。これは、すべてのメンバーが同じパッケージ内に表示されますが、他のパッケージからはアクセスできないことを意味します。

package com.baeldung.accessmodifiers;

public class SuperPublic {
    static void defaultMethod() {
        ...
    }
}

defaultMethod()は、同じパッケージの別のクラスでアクセスできます。

package com.baeldung.accessmodifiers;

public class Public {
    public Public() {
        SuperPublic.defaultMethod(); // Available in the same package.
    }
}

ただし、他のパッケージでは利用できません。

3. 公衆

public キーワードをクラス、メソッド、またはプロパティに追加すると、全世界で利用できるようになります。 すべてのパッケージの他のすべてのクラスがそれを使用できるようになります。 これは最も制限の少ないアクセス修飾子です。

package com.baeldung.accessmodifiers;

public class SuperPublic {
    public static void publicMethod() {
        ...
    }
}

publicMethod()は別のパッケージで利用できます:

package com.baeldung.accessmodifiers.another;

import com.baeldung.accessmodifiers.SuperPublic;

public class AnotherPublic {
    public AnotherPublic() {
        SuperPublic.publicMethod(); // Available everywhere. Let's note different package.
    }
}

public キーワードをクラス、インターフェイス、ネストされたパブリッククラス、またはインターフェイスとメソッドに適用した場合の動作の詳細については、専用の記事を参照してください。

4. プライベート

private キーワードを持つメソッド、プロパティ、またはコンストラクターは、同じクラスからのみアクセスできます。 これは最も制限の厳しいアクセス修飾子であり、カプセル化の概念の中核です。 すべてのデータは外界から隠されます:

package com.baeldung.accessmodifiers;

public class SuperPublic {
    static private void privateMethod() {
        ...
    }
    
     private void anotherPrivateMethod() {
         privateMethod(); // available in the same class only.
    }
}

この詳細記事では、 private キーワードをフィールド、コンストラクター、メソッド、および内部クラスに適用した場合の動作を説明します。

5. 保護されています

publicprivateのアクセスレベルの間には、protectedアクセス修飾子があります。

protected キーワードを使用してメソッド、プロパティ、またはコンストラクターを宣言すると、同じパッケージ(package-privateアクセスレベルの場合と同様)から、さらにそのクラスのすべてのサブクラスからメンバーにアクセスできます。 、他のパッケージに含まれている場合でも:

package com.baeldung.accessmodifiers;

public class SuperPublic {
    static protected void protectedMethod() {
        ...
    }
}

protectedMethod()は、サブクラスで使用できます(パッケージに関係なく)。

package com.baeldung.accessmodifiers.another;

import com.baeldung.accessmodifiers.SuperPublic;

public class AnotherSubClass extends SuperPublic {
    public AnotherSubClass() {
        SuperPublic.protectedMethod(); // Available in subclass. Let's note different package.
    }
}

専用記事では、同じパッケージまたは別のパッケージのフィールド、メソッド、コンストラクター、内部クラス、およびアクセシビリティで使用される場合のキーワードについて詳しく説明しています。

6. 比較

次の表は、使用可能なアクセス修飾子をまとめたものです。 使用されているアクセス修飾子に関係なく、クラスは常にそのメンバーにアクセスできることがわかります。

修飾子 クラス パッケージ サブクラス 世界
public
Y Y Y Y
protected
Y Y Y N
default
Y Y N N
private
Y N N N

7. 結論

この短い記事では、Javaのアクセス修飾子について説明しました。

誤用を防ぐために、特定のメンバーに対して可能な限り最も制限の厳しいアクセスレベルを使用することをお勧めします。 正当な理由がない限り、常にprivateアクセス修飾子を使用する必要があります。

Public アクセスレベルは、メンバーがAPIの一部である場合にのみ使用する必要があります。

いつものように、コード例はGithubから入手できます。