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