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