こんにちは!しーま(@s59shima)です。
いつもブログをご覧いただきありがとうございます。
今回はこんな悩みや疑問を持った人に向けて記事を書きました。

アクセス修飾子を使い分ける必要はあるの!?全てpublicで宣言して問題ないかな!?
アクセス修飾子を適切な権限で宣言する理由が分からない方や4つのアクセス修飾子の使い分けがイマイチ分からない方にはおすすめの記事です。
アクセス修飾子を使い分ける理由は1つ
アクセス修飾子を使い分ける理由は、アクセス範囲を定めるためです。
フィールドやメソッドに対して、アクセス修飾子を設けることで、他のクラスから参照させるのか・させないのか制御することができます。
アクセス修飾子はカプセル化の理解にも繋がります。
下記の記事も合わせてどうぞ!
アクセス修飾子の一覧(4つ)
アクセス修飾子は「public」「protected」「なし」「private」の4種類です。
この4種類がどのようなアクセス範囲になっているのか一覧で確認してみましょう!
No | アクセス修飾子 | 同一クラス | 同一パッケージ | サブクラス | 全て |
---|---|---|---|---|---|
1 | public | ● | ● | ● | ● |
2 | protected | ● | ● | ● | × |
3 | なし | ● | ● | × | × |
4 | private | ● | × | × | × |
つまり、No列の数字が大きいほど、アクセス範囲が狭いことがわかりますね。逆に No列の数字が小さいほど、アクセス範囲が広いということです。
アクセス修飾子の順番を確認
4種類のアクセス修飾子が実際に上記の図のようになるのか確認してみましょう。
このようなファイル構成で、アクセス修飾子を確認していきます。

確認パターン1.同一クラスの場合

上記の図だと、同一クラスでの確認ですね。
publicからprivateの4種類すべてがアクセスできるか確認です。
Mainクラスの中身はこちら。
public class Main {
// 4種類のアクセス修飾子を用意
public String msg_public = "public";
protected String msg_protected = "protected";
String msg_Default = "default";
private String msg_private = "private";
public static void main(String[] args) {
Main main = new Main();
// アクセス可能か確認
System.out.println( main.msg_public );
System.out.println( main.msg_protected );
System.out.println( main.msg_Default );
System.out.println( main.msg_private );
}
}
実行結果
public
protected
default
private
同一クラスの場合、4種類全てのアクセス修飾子にアクセスできることを確認できました。
確認パターン2.同一パッケージの場合

上記の図だと、同一パッケージでの確認ですね。
TestAクラスの中身を確認・実行してみましょう!
public class TestA {
public static void main(String[] args) {
Main main = new Main();
System.out.println( main.msg_public );
System.out.println( main.msg_protected );
System.out.println( main.msg_Default );
//System.out.println( main.msg_private );
}
}
MainクラスとTestAクラスは同一パッケージです。private変数は構文エラーになるため、コメントにしています。
実行結果
public
protected
default
確認パターン3.サブクラスの場合

上記の図だと、サブクラスでの確認ですね。
TestB2クラスの中身を確認・実行してみましょう!
package sampleB;
import sampleA.Main;
public class TestB2 extends Main {
public static void main(String[] args) {
TestB2 b2 = new TestB2();
System.out.println( b2.msg_public );
System.out.println( b2.msg_protected );
// System.out.println( b2.msg_Default );
// System.out.println( main.msg_private );
}
}
デフォルト変数とprivate変数は構文エラーになるため、コメントにしています。
実行結果
public
protected
確認パターン4.全ての場合

上記の図だと、全てでの確認ですね。
TestBクラスの中身を確認・実行してみましょう!
package sampleB;
import sampleA.Main;
public class TestB {
public static void main(String[] args) {
Main main = new Main();
System.out.println( main.msg_public );
// System.out.println( main.msg_protected );
// System.out.println( main.msg_Default );
// System.out.println( main.msg_private );
}
}
protected変数・デフォルト変数・private変数は構文エラーになるため、コメントにしています。
実行結果
public
アクセス修飾子とstaticを両方宣言する場合
クラス、メソッド、フィールドで複数の修飾子を列挙する場合、以下のように書きます。
アクセス修飾子(publilc・protected・private) + static
アクセス修飾子は最も左側に書いて、staticなどの修飾子はその後に書きます。
まとめ
今回は、アクセス修飾子を使い分ける必要はあるのか? という疑問や使い分ける方法について回答してきました。
本記事をまとめると以下の通りです。
- アクセス修飾子を使い分ける事で、オブジェクトのカプセル化を実現
- アクセス修飾子の使い分ける基準は、同一クラス・同一パッケージ・サブクラス
- 複数の修飾子を列挙する場合、アクセス修飾子 + staticなど とする