アクセス修飾子

アクセス修飾子とは

アクセス修飾子はメソッドやプロパティに対して、外部ファイルからのアクセス範囲を限定することができます。

アクセス修飾子の目的

プログラミングで予期しないエラーを発生させないために、アクセス範囲を最小限に限定することは大切です。データを簡単に変更できないようにして、バグを防止できるという考え方です。

アクセス修飾子の種類

アクセス修飾子は「public」「protected」「private」「デフォルト(なし)」があります。

アクセス修飾子一覧

修飾子 アクセス
public すべてのクラス
protected 現在のクラスとサブクラス
デフォルト(なし) 現在のクラスと同じパッケージのクラス
private 現在のクラスのみ

アクセスの範囲

修飾子、パッケージ、継承など組み合わせによってアクセス範囲が異なります。

アクセスの範囲一覧

状態 public protected デフォルト(なし) private
同じクラス
同じパッケージの他のクラス ×
別パッケージのサブクラス × ×
別パッケージのサブクラス以外のクラス × × ×

同じパッケージで「private」の場合

プロパティのアクセス修飾子を「private」にした例です。

UserBean.java
public class UserBean {
	private String email;
}

外部からアクセスできない

て、外部ファイルからデータアクセスできないようになります。

App.java

ファイルの用意

ファイル構成

src
└── sns
	  ├── App.java
	  ├── PrimeUser.java
	  └── entity
	  		├── App.java
	  		└── UserBean.java

ファイル作成

「UserBean」クラスを作成して「email」プロパティを「public」で定義します。

entity.UserBean

UserBean.java
public class UserBean {
	public String email;
}

sns.PrimeUser

「UserBean」をスーパークラスとした「PrimeUser」を作成し、showEmail() で「email」にアクセスします。

PrimeUser.java
package sns.entity;

public class PrimeUser extends UserBean {
	public void showEmail() {
		System.out.println(this.email);
	}
}

sns.App

「sns」パッケージにメインプログラムを作成し、「UserBean」の「email」にアクセスします。

App.java
package sns;

public class App {
	public static void main(String[] args) {
		UserBean user = new UserBean();
		user.email = "test@example.com";
	}
}

sns.App

「sns.entity」パッケージに同様のメインプログラムを作成します。

sns.entity.App.java
package sns.entity;

public class App {

	public static void main(String[] args) {
		UserBean user = new UserBean();
		user.email = "test@test.com";
	}

}

public

アクセス修飾子を「public」は、すべての外部ファイルからアクセス可能になります。

サブクラスの場合

サブクラスからでもアクセスできます。

private

外部ファイルのアクセスの場合

「UserBean」プロパティのアクセス修飾子を「private」に変更します。

UserBean.java
public class UserBean {
	private String email;
}

外部ファイルからアクセスできない

「email」プロパティにアクセスすると「private」になっているため、すべての外部ファイルからアクセスできません。

protected

「UserBean」プロパティのアクセス修飾子を「protected」に変更します。

UserBean.java
public class UserBean {
	protected String email;
}

パッケージが違う場合

「sns.entity.UserBean」と「sns.App」のパッケージが違うのでアクセスできません。

違うパッケージの継承の場合

「shop.entity.UserBean」と「shop.PrimeUser」のパッケージが違い、継承している場合はアクセスできます。

パッケージが同じの場合

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

デフォルト

修飾子をつけない(デフォルト)場合です。

UserBean.java
public class UserBean {
	String email;
}

同じパッケージ

同じパッケージはアクセスできる

修飾子なしの場合、同じパッケージのクラスファイルであればアクセスできます。

違うパッケージファイル

違うパッケージファイルからはアクセスできない

「protected」と同様、外部ファイルと違うパッケージのアクセスはできません。

違うパッケージのサブクラスの場合

継承してもアクセスできない

違うパッケージファイルの場合、継承してアクセスできません。

演習

問題1

すべての外部ファイルからアクセスできるアクセス修飾子はどれですか?

1)public

2)private

3)protected

4)デフォルト

問題2

自分のクラス以外の外部ファイルからアクセスを拒否するアクセス修飾子はどれですか?

1)public

2)private

3)protected

4)デフォルト

問題2

デフォルトのアクセス修飾子で、正しいのはどれですか?

1)public String name;

2)private String name;

3)protected String name;

4)String name;