Javaのアクセス修飾子は、Javaでアクセス制御を提供するために使用されます。Javaは、3つのキーワードを通じてアクセス制御を提供します – private、protected、およびpublic。これらのアクセス修飾子を常に使用する必要はありませんが、もう1つのアクセス修飾子、「デフォルトアクセス」、「パッケージプライベート」、または「修飾子なし」があります。
Javaアクセス修飾子
Javaアクセス修飾子は、クラス、クラス変数、およびメソッドとともに使用できます。Javaクラスでは、「public」または「default」アクセス修飾子のみを使用できます。
- クラスが「public」の場合、どこからでもアクセスできます。つまり、他のパッケージにある他のクラスからなどです。
- ソースファイルには1つの「public」クラスしか持てず、ファイル名はpublicクラス名と同じでなければなりません。
- クラスが「デフォルトアクセス」の場合、それは同じパッケージ内の他のクラスからのみアクセスできます。
クラスメンバーとのJavaアクセス修飾子
クラスのメンバ変数とメソッドには、4つのアクセス修飾子を使用することができます。ただし、メンバのアクセス修飾子のルールは、クラスレベルのアクセスルールの後に適用されます。たとえば、クラスがデフォルトのアクセスを持っている場合、他のパッケージでは見えないため、クラスのメソッドや変数も見えません。それぞれを個別に見て、シンプルなプログラムを使用してJavaのアクセス修飾子の使用方法を示します。
Javaのアクセス修飾子 – publicキーワード
クラスメンバが「public」である場合、どこからでもアクセスできます。メンバ変数やメソッドはグローバルにアクセスされます。これは、クラスメンバへのアクセスを提供する最もシンプルな方法です。ただし、クラス変数にはこのキーワードを使用する際に注意する必要があります。それ以外の場合、値を変更できる可能性があります。通常、クラス変数はprivateに保持し、getter-setterメソッドを提供して使用します。
Javaのアクセス修飾子 – privateキーワード
クラスメンバーが「private」である場合、それは同じクラス内でのみアクセス可能です。これは最も制限されたアクセスであり、クラスメンバーは外部世界には見えません。通常、クラス変数をprivateとし、クラス内でのみ使用されるメソッドをprivateとします。
同じパッケージ内のクラスおよびサブクラスのみがアクセスできるように、「protected」でクラスメンバーが定義されています。この修飾子はprivateよりも制限が少なく、publicアクセスよりも制限が多いです。通常、このキーワードを使用して、クラス変数がサブクラスのみにアクセス可能であることを確認します。
Javaのアクセス修飾子 – デフォルトアクセス
クラスメンバーにアクセス修飾子が指定されていない場合、デフォルトのアクセスで扱われます。アクセス規則はクラスと類似しており、デフォルトのアクセスを持つクラスメンバーは、同じパッケージ内のクラスからのみアクセスできます。このアクセスはpublicおよびprotectedよりも制限されていますが、privateよりも制限されていません。 (最もアクセスが制限されている)private < default < protected < public (最もアクセスが制限されていない)以下の表は、同じパッケージまたは他のパッケージおよびサブクラスに対する上記のアクセス修飾子を要約しています。 以下は、Javaのアクセス修飾子がどのように動作するかを示すいくつかの単純なクラスを書いてみましょう。
TestA.java
package com.journaldev.access;
class TestA {
public void methodPublic(){
methodPrivate();
}
protected void methodProtected(){
methodPrivate();
}
void methodDefault(){
methodPrivate();
}
private void methodPrivate(){}
}
TestAクラスがデフォルトのアクセスを持っていることに注意してください。privateクラスメソッドは同じクラスの他の部分からアクセスできます。 TestB.java
package com.journaldev.access;
import com.journaldev.access.TestA;
public class TestB {
public static void main(String args[]) {
new TestA().methodPublic();
new TestA().methodProtected();
new TestA().methodDefault();
}
public void methodPublic() {
}
protected void methodProtected() {
}
void methodDefault() {
}
private void methodPrivate() {
}
}
TestBはTestAクラスと同じパッケージにあるため、そのクラスメンバーにアクセスできます。privateメンバーはアクセスできませんが、同じパッケージのため他のすべてのメンバーにアクセスできます。 TestC.java
package com.journaldev.access.child;
import com.journaldev.access.TestB;
public class TestC {
public static void main(String[] args) {
new TestB().methodPublic();
}
}
TestBクラスはpublicなのでアクセスできます。TestCクラスは同じパッケージにないため、TestBのサブクラスでもないため、TestBクラスのpublicメンバーのみがアクセスできます。 TestE.java
package com.journaldev.util;
import com.journaldev.access.TestB;
public class TestE extends TestB {
public static void main(String[] args) {
new TestB().methodPublic();
new TestB().methodProtected(); // compile time error
//サブクラスを使用してスーパークラスのprotectedメソッドにアクセスすることができます
new TestE().methodProtected();
}
}
TestEクラスはTestBのサブクラスであるため、子クラスTestEを介してTestBの保護されたメンバーにアクセスできます。スーパークラスの保護されたメソッドに直接アクセスしようとすると、コンパイル時エラーが発生します。これでJavaのアクセス修飾子についての説明は終わりです。単純に理解できます。デフォルトと保護されたアクセスを混同しないでください。覚える簡単な方法は、デフォルトのアクセスが保護されたアクセスよりも制限されているということであり、保護されたメンバーはサブクラスでアクセスできるということです。最近、Javaのアクセス修飾子について詳しく説明したビデオを作成しました。以下のYouTubeでご覧いただけます。 https://www.youtube.com/watch?v=QKjnbC3UBtY
Source:
https://www.digitalocean.com/community/tutorials/java-access-modifiers