24.
アクセス修飾子
アクセス修飾子
アクセス修飾子とは
アクセス修飾子はメソッドやプロパティに対して、外部ファイルからのアクセス範囲を限定することができます。
アクセス修飾子の目的
プログラミングで予期しないエラーを発生させないために、アクセス範囲を最小限に限定することは大切です。データを簡単に変更できないようにして、バグを防止できるという考え方です。
アクセス修飾子の種類
アクセス修飾子はpublic、protected、privateや、アクセス修飾子がないデフォルトがあります。
アクセス修飾子一覧
修飾子 | アクセス |
---|---|
public | すべてのクラス |
protected | 現在のクラスとサブクラス |
デフォルト(なし) | 現在のクラスと同じパッケージのクラス |
private | 現在のクラスのみ |
アクセスの範囲
修飾子、パッケージ、継承など組み合わせによってアクセス範囲が異なります。
アクセスの範囲一覧
状態 | public | protected | デフォルト(なし) | private |
---|---|---|---|---|
同じクラス | ○ | ○ | ○ | ○ |
同じパッケージの他のクラス | ○ | ○ | ○ | × |
別パッケージのサブクラス | ○ | ○ | × | × |
別パッケージのサブクラス以外のクラス | ○ | × | × | × |
同じパッケージで「private」の場合
プロパティのアクセス修飾子をprivateにした例です。
User.java
public class User {
private String email;
}
外部からアクセスできない
アクセス修飾子privateは、外部ファイルからデータアクセスできないようになります。
App.java

ファイルの用意
ファイル構成
src/
└── sns/
├── App.java
├── PrimeUser.java
└── entity/
├── App.java
└── User.java
ファイル作成
Userクラスを作成して、emailプロパティをpublicで定義します。
Userクラス
sns.entity.User.java
public class User {
public String email;
}
PrimeUserクラス
PrimeUserクラスを作成し、Userクラスを継承します。showEmail() でemailプロパティにアクセスします。
sns.PrimeUser.java
package sns;
public class PrimeUser extends User {
public void showEmail() {
System.out.println(this.email);
}
}
メインプログラム(sns)
snsパッケージにメインプログラムAppを作成し、Userクラスのemailにアクセスします。
sns.App.java
package sns;
public class App {
public static void main(String[] args) {
User user = new User();
user.email = "[email protected]";
}
}
メインプログラム(sns.entity)
sns.entityパッケージに、メインプログラムAppを作成します。
sns.entity.App.java
package sns.entity;
public class App {
public static void main(String[] args) {
User user = new User();
user.email = "[email protected]";
}
}
public
アクセス修飾子をpublicは、すべての外部ファイルからアクセス可能になります。

private
外部ファイルのアクセス
プロパティのアクセス修飾子をprivateに変更します。
sns.entity.User.java
public class User {
private String email;
}
外部ファイルからアクセスできない
emailのアクセス修飾子はprivateのため、すべての外部ファイルからアクセスできません。

protected
アクセス修飾子をprotectedに変更します。
sns.entity.User.java
public class User {
protected String email;
}
パッケージが違う場合
sns.entity.Userとsns.Appのパッケージが違うのでアクセスできません。

package sns.entity;
public class App {
public static void main(String[] args) {
User user = new User();
user.email = "[email protected]";
}
}
違うパッケージの継承した場合
sns.entity.Userとsns.PrimeUserのパッケージが違う場合、継承している場合はアクセスできます。

パッケージが同じ場合
shop.entity.App.javaは、同じパッケージなのでアクセスできます。

デフォルト
修飾子をつけない(デフォルト)場合です。
sns.entity.User.java
package sns.entity;
public class User {
String email;
String name;
String password;
}
同じパッケージ
同じパッケージはアクセスできる
修飾子なしの場合、同じパッケージのクラスファイルであればアクセスできます。
違うパッケージファイル
protectedと同様、外部ファイルと違うパッケージのアクセスはできません。
違うパッケージのサブクラスの場合
継承してもアクセスできない
違うパッケージファイルの場合、継承してアクセスできません。
演習
問題1
すべての外部ファイルからアクセスできるアクセス修飾子はどれですか?
- public
- private
- protected
- デフォルト
問題2
自分のクラス以外の外部ファイルからアクセスを拒否するアクセス修飾子はどれですか?
- public
- private
- protected
- デフォルト
問題2
デフォルトのアクセス修飾子で、正しいのはどれですか?
- public String name;
- private String name;
- protected String name;
- String name;