Javaのアクセス修飾子についてです。
目次
アクセス修飾子 | アクセス修飾子 |
publicのサンプル | |
protectedのサンプル | |
修飾子なしのサンプル | |
privateのサンプル |
アクセス修飾子
アクセス修飾子は、アクセスの範囲を限定します。(スコープを狭める)
範囲が限定されていると、修正時に影響する範囲が狭まり修正しやすくなります。
項目 | 説明 |
---|---|
public | すべてのクラスからアクセス可能 |
protected | 1.同じパッケージのクラスからアクセス可能 2.異なるパッケージのサブクラスからアクセス可能 |
修飾子なし | 同じパッケージのクラスからアクセス可能 (パッケージプライベートとも呼ばれます) |
private | 現在のクラスからアクセス可能 |
クラスのアクセス修飾子について
クラスは、publicまた修飾子なしのみ使用できます。
インナークラスでは、上記4つとも使用できます。
フィールド、メソッド、コンストラクタのアクセス修飾子について
上記4つとも使用できます。
その他
メンバー変数は基本privateにします。
クラスのアクセスの制限があって次にメンバーのアクセスの制限となります。
アクセス修飾子がなしのクラスAがあった場合、異なるパッケージのクラスBからクラスAのpublicのメソッドにアクセスできません。
protectedは、異なるパッケージから継承させても良い場合に使用したり、サブクラスからアクセスするときの目印的な使われ方が多いです。
アクセス修飾子は、ローカル変数には使用できません。
カプセル化
クラスとメソッドをpublicにして、フィールド変数をprivateにすることをカプセル化といいます。
メソッドを通してのみ、フィールド変数の取得と設定ができる仕組みです。不正な値の書き換えを防ぐことができます。
カプセル化は、オブジェクト指向の3大要素の一つです。(他は継承とポリモーフィズム)
publicのサンプル
すべてのクラスからアクセス可能であることを確認 |
メソッドにpublicを使用するサンプルです。
Class1クラスのメソッドがpublicで、Class2クラスのメソッドからアクセスします。
Class1.java
package package1;
public class Class1 {
public void getName() {
System.out.println("red");
}
}
4行目のメソッドのアクセス修飾子はpublicです。
Class2.java
package package2;
import package1.Class1;
public class Class2 {
public static void main(String[] args) {
Class1 c1 = new Class1();
c1.getName(); //red
}
}
3行目は、Class1クラスはパッケージが異なるのでインポートしています。
8行目は、異なるパッケージにあるメソッドにアクセスしています。
7,8行目は、参照先のクラスとメソッドがpublicでない場合は、コンパイルエラーになります。
protectedのサンプル
異なるパッケージのサブクラスからアクセス可能であることを確認 |
メソッドにprotectedを使用するサンプルです。
Class1が親クラスで、Class2が子クラスです。継承しています。
Class1クラスのメソッドがprotectedで、Class2クラスのメソッドからアクセスします。
Class1.java
package package1;
public class Class1 {
protected void getName() {
System.out.println("red");
}
}
4行目のアクセス修飾子はprotectedです。
Class2.java
package package2;
import package1.Class1;
public class Class2 extends Class1{
void test() {
getName();
}
}
3行目は、Class1クラスはパッケージが異なるのでインポートしています。
5行目でClass1クラスを継承しています。
7行目のメソッドで、異なるパッケージにあるメソッドにアクセスしています。
Class2クラスは、Class1クラスからの継承がない場合は7行目のメソッドでコンパイルエラーになります。
Class1のメソッドがprotectedでない場合も、7行目のメソッドでコンパイルエラーになります。(publicは実行可能です)
修飾子なしのサンプル
同じパッケージのクラスからアクセス可能であることを確認 |
メソッドを修飾子なしにするサンプルです。
Class1クラスのメソッドは修飾子なしで、Class2クラスのメソッドからアクセスします。
Class1.java
package package1;
public class Class1 {
void getName() {
System.out.println("red");
}
}
4行目のアクセス修飾子はありません。
Class2.java
package package1;
public class Class2{
public static void main(String[] args) {
Class1 c1 = new Class1();
c1.getName(); //red
}
}
6行目のメソッドで、同じパッケージにあるメソッドにアクセスしています。
Class1 クラスのメソッドの修飾子はないため可能です。
Class1 クラスのメソッドがprivateだと、コンパイルエラーになります。
privateのサンプル
メソッドにprivateを使用するサンプルです。
Class1クラスのメソッドにprivateを指定した場合、Class2クラスからはアクセスできません。
privateのメソッドは、同じクラスからのみアクセスできます。
関連の記事