Javaにおけるアクセス修飾子

Javaのアクセス修飾子

1. 概要

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

Simply put, there are four access modifiers:publicprivateprotected、およびdefault(キーワードなし)。

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

2. デフォルト

キーワードを明示的に使用しない場合、Javaは特定のクラス、メソッド、またはプロパティへのdefaultアクセスを設定します。 デフォルトのアクセス修飾子はpackage-privateとも呼ばれます。これは、all members are visible within the same packageですが、他のパッケージからはアクセスできないことを意味します。

package com.example.accessmodifiers;

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

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

package com.example.accessmodifiers;

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

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

3. パブリック

publicキーワードをクラス、メソッド、またはプロパティに追加すると、we’re making it available to the whole world、つまり すべてのパッケージの他のすべてのクラスで使用できます。 これは、最も制限の少ないアクセス修飾子です。

package com.example.accessmodifiers;

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

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

package com.example.accessmodifiers.another;

import com.example.accessmodifiers.SuperPublic;

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

4. 非公開

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

package com.example.accessmodifiers;

public class SuperPublic {
    static private void privateMethod() {
        ...
    }

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

5. 保護されています

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

protectedキーワードを使用してメソッド、プロパティ、またはコンストラクターを宣言すると、他のパッケージにある場合でも、same package (as with package-private access level) and in addition from all subclasses of its classからメンバーにアクセスできます。

package com.example.accessmodifiers;

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

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

package com.example.accessmodifiers.another;

import com.example.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の一部である場合にのみ使用する必要があります。

いつものように、コード例は利用可能なover on Githubです。