Javaのアクセス修飾子のサンプルです。
目次
アクセス修飾子
アクセス修飾子は、アクセスを限定します。
アクセスの限定の多いほうが修正時に影響する範囲が狭まり修正しやすくなります。
メンバー変数は基本privateにします。
クラスのアクセスの制限があって次にメンバーのアクセスの制限となります。
アクセス修飾子がなしのクラスAがあった場合、異なるパッケージのクラスBからクラスAのpublicのメソッドにアクセスできません。
protectedは、異なるパッケージから継承させても良い場合に使用したり、サブクラスからアクセスするときの目印的な使われ方が多いです。
| 項目 | 説明 | メンバー変数 | メソッド | コンストラクタ |
|---|---|---|---|---|
| public | すべてのクラスからアクセス可能 | ○ | ○ | ○ |
| protected | 同じパッケージのクラスからアクセス可能 異なるパッケージのサブクラスからアクセス可能 |
○ | ○ | ○ |
| 修飾子なし | 同じパッケージのクラスからアクセス可能 パッケージプライベートとも呼ばれます |
○ | ○ | ○ |
| private | 現在のクラスからアクセス可能 | ○ | ○ | ○ |
publicのサンプル
publicは、すべてのクラスからアクセス可能です。
test1パッケージのSample1クラスのメソッドにpublicを指定しています。
test2パッケージのSample2クラスからアクセスできます。

Sample1.java
5行目のアクセス修飾子はpublicです。
package test1;
public class Sample1 {
public void getNum1() {
System.out.println("abc");
}
}
Sample2.java
3行目は、パッケージが異なるのでインポートしています。
7行目は、異なるパッケージにあるクラスをインスタンス化しています。
8行目は、異なるパッケージにあるメソッドにアクセスしています。
7,8行目は、参照先のクラスとメソッドがpublicでない場合は、コンパイルエラーになります。
package test2;
import test1.Sample1;
public class Sample2 {
public static void main(String[] args) {
Sample1 s1 = new Sample1();
s1.getNum1(); //abc
}
}
protectedのサンプル
protectedは、同じパッケージのクラスからアクセス可能です。
また、異なるパッケージのサブクラス(子クラス)からもアクセス可能です。
test1パッケージのSample1.javaが親クラスで、test2パッケージのSample2.javaが子クラスです。継承しています。
Sample1クラスのメソッドにprotectedを指定した場合、Sample2クラスからアクセスできます。

Sample1.java
5行目のアクセス修飾子はprotectedです。
package test1;
public class Sample1{
protected void getNum1() {
System.out.println("abc");
}
}
Sample2.java
3行目は、パッケージが異なるのでインポートしています。
5行目でSample1クラスを継承しています。
7行目のメソッドで、異なるパッケージにあるメソッドにアクセスしています。Sample2クラスはSample1クラスの子クラスであり、Sample1クラスのメソッドがprotectedのため可能です。protectedがない場合は、コンパイルエラーになります。
package test2;
import test1.Sample1;
public class Sample2 extends Sample1 {
public void S1() {
getNum1();
}
}
修飾子なしのサンプル
修飾子なしは、同じパッケージのクラスからアクセス可能です。
test1パッケージに2つのクラスがあります。
Sample1クラスのメソッドに修飾子を指定しない場合、Sample2クラスからアクセスできます。

Sample1.java
5行目のアクセス修飾子はありません。
package test1;
public class Sample1 {
void getNum1() {
System.out.println("abc");
}
}
Sample2.java
6行目のメソッドで、同じパッケージにあるメソッドにアクセスしています。Sample1クラスのメソッドの修飾子はないため可能です。privateの場合は、コンパイルエラーになります。
package test1;
public class Sample2 {
public static void main(String[] args) {
Sample1 s1 = new Sample1();
s1.getNum1(); //abc
}
}
privateのサンプル
privateは、現在のクラスからのみアクセス可能です。
test1パッケージに2つのクラスがあります。
Sample1クラスのメソッドにprivateを指定した場合、Sample2クラスからはアクセスできません。
Sample1クラスのメソッドは、Sample1クラスからのみアクセスできます。

関連の記事
Java クラスの変数の用語のサンプルとまとめ(メンバー変数他)
Java 変数のデータ型とラッパークラスとボクシング変換