アクセス修飾子

アクセス修飾子とは

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

アクセス修飾子の目的

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

アクセス修飾子の種類

アクセス修飾子はpublicprotectedprivateや、アクセス修飾子がないデフォルトがあります。

アクセス修飾子一覧

修飾子 アクセス
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.Usersns.Appのパッケージが違うのでアクセスできません。

package sns.entity;

public class App {
    public static void main(String[] args) {
        User user = new User();
        user.email = "[email protected]";
    }
}

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

sns.entity.Usersns.PrimeUserのパッケージが違う場合、継承している場合はアクセスできます。

パッケージが同じ場合

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

デフォルト

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

sns.entity.User.java
package sns.entity;

public class User {
    
    String email;
	String name;
	String password;

}

同じパッケージ

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

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

違うパッケージファイル

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;