Javaのアクセス修飾子とは
アクセス修飾子とは、クラスやメンバフィールド、メソッドの他クラスへの公開範囲を決定する修飾子のことです。
アクセス修飾子によってアクセスの制限をかけられ、その種類には4つあります。
アクセス修飾子の種類一覧
Javaのアクセス修飾子には以下の4つがあります。
- public
- protected
- private
- 指定なし(デフォルト)
それぞれについて見ていきましょう。
public
publicは、どこからでもアクセスを可能にできるアクセス修飾子です。
publicなクラス・インタフェースは、1つのファイルに1つしか記述できないという特徴もあります。
また、「拡張子を除くファイル名」と「クラス・インタフェース名」は同じであることが条件です。
■記述例 class ClassPublic { public String str = "ClassPublicのstr変数です"; } public class Main { public static void main(String[] args) { ClassPublic cp = new ClassPublic(); System.out.println(cp.str); } }
■実行結果 ClassPublicのstr変数です
protected
protectedは、同じパッケージ内のクラスや異なるパッケージであっても、該当クラスを継承したサブクラス内部からアクセスできるアクセス修飾子です。
サブクラスから参照するケースの記述例は、下記のようになります。
■記述例 class ClassSuper { protected String str = "ClassSuperのstr変数です"; } public class ClassSub extends ClassSuper { public static void main(String[] args) { ClassSub cs = new ClassSub(); System.out.println(cs.str); } }
■実行結果 ClassSuperのstr変数です
同一クラスから参照するケースの記述例は、下記のようになります。
■記述例 public class ClassSub{ public static void main(String[] args) { methodSub(); } protected static void methodSub() { System.out.println("methodSubで出力しています"); } }
■実行結果 methodSubで出力しています
private
privateは、クラス内部からのみアクセスができるアクセス修飾子です。
外部からのアクセスを不用意に許可せず、決められたメソッドからのみアクセスさせたい場合に有効なアクセス修飾子になっています。
■記述例 class ClassPrivate { private String str = "ClassPublicのstr変数です"; public void privateMethod() { System.out.println(str + ":ClassPublicで出力しています!"); } } public class Main { public static void main(String[] args) { ClassPrivate cp = new ClassPrivate(); cp.privateMethod(); } }
■実行結果 ClassPublicのstr変数です:ClassPublicで出力しています!
指定なし(デフォルト)
アクセス修飾子が付けられておらず、指定がない場合のアクセス指定です。
この場合、同パッケージ内のすべてのクラスからアクセスできるようになります。
アクセス修飾子のスコープ一覧
アクセス修飾子のスコープ範囲は、下記のように分けられています。
アクセス修飾子 | 同一クラス | 同一パッケージ | サブクラス | すべて |
---|---|---|---|---|
public | 〇 | 〇 | 〇 | 〇 |
protected | 〇 | 〇 | 〇 | × |
指定なし | 〇 | 〇 | × | × |
private | 〇 | × | × | × |
public修飾子のスコープが最も広く設定されており、どのクラスからも参照できますね。
アクセス修飾子を記述する順番
アクセス修飾子は、クラスやメソッド、フィールドで複数の修飾子を列挙する場合、以下のように記述できます。
アクセス修飾子(publilc・protected・private) + static
このように、アクセス修飾子は一番左側に記述し、staticなどの修飾子はアクセス修飾子の後ろに記述しましょう。
アクセス修飾子の使い方
アクセス修飾子の使い方をサンプルコードで紹介します。
■記述例 class Point { private int privatePoint; public void setPoint(int privatePoint) { this.privatePoint = privatePoint; } public int getPoint() { return privatePoint; } } public class Main { public static void main(String[] args) { Point point = new Point(); int get = 5000; point.setPoint(get); System.out.println("取得したポイント:" + get); int nowPoint = point.getPoint(); System.out.println("現在所有しているポイント:" + nowPoint); } }
上記のプログラムを実行すると、下記の実行結果を得られます。
■実行結果 取得したポイント:5000 現在所有しているポイント:5000
また、17行目に「point.privatePoint = 0;」を追加すると、private修飾子のprivatePointを操作しようとしているためエラーが表示されます。
■記述例 class Point { private int privatePoint; public void setPoint(int privatePoint) { this.privatePoint = privatePoint; } public int getPoint() { return privatePoint; } } public class Main { public static void main(String[] args) { Point point = new Point(); int get = 5000; point.setPoint(get); System.out.println("取得したポイント:" + get); point.privatePoint = 0; int nowPoint = point.getPoint(); System.out.println("現在所有しているポイント:" + nowPoint); } }
■実行結果 Main.java:17: エラー: privatePointはPointでprivateアクセスされます point.privatePoint = 0; ^ エラー1個
アクセス修飾子の使い分け
アクセス修飾子を使い分けるのは、アクセス範囲を定めたい場合です。
フィールドやメソッドに対してアクセス修飾子を設定すれば、他クラスから参照させるのか・させないのかを制御できます。
これは、作成するプログラムや内容によりますので、必要に応じて適切なアクセス修飾子を使いましょう。
アクセス修飾子は省略できる?なしの場合は?
アクセス修飾子は省略可能です。
なしの場合は、同パッケージ内のすべてのクラスからアクセスできます。
加えて、パッケージの直下にある通常のクラス(トップレベルクラス)に付加できるアクセス修飾子は publicのみとなっています。