アクセス修飾子
クラスやフィールド、メソッドヘのアクセスを制御するための修飾子をアクセス修飾子という。アクセス修飾子には、public 、protected、privateの3種類がある。
これらをクラス、フィールド、またはメソッドの宣言の前につけることで、次の表 のようなアクセス制御を行える。(○アクセス制御を行える範囲)
アクセス修飾子 | 同クラス | 同パッケージ | サブクラス | 他 |
---|---|---|---|---|
public | ○ | ○ | ○ | ○ |
protected | ○ | ○ | ○ | |
(なし) | ○ | ○ | ||
private | ○ |
クラスにつけられる修飾子はpublicのみ。また、複数のクラスの宣言を1つのファイルの中に記述する場合、public修飾子をつけられるクラスは1つだけ。
class Student{
private int score;
public void setScore(int s){
:
score = s;
}
}
stu setScore(80);
//上記のクラスではsetScoreメソッドはpublicを指定しているので使える
stu.score = 80;
//メンバ変数scoreはprivateを指定しているのでエラーになる
よく使われる修飾子と使いわけ
主に使われるのはpublic(公開)とprivate(隠蔽)
・クラスとメソッドはpublic
・メンバ変数はprivate
をする事が一般的に多い
(理由は外部クラスから直接アクセスできないようにする、変数への直接代入をprivateで禁止してメソッドを通してのみ値が代入できるようにして不正な値が入るのを防ぐ事ができる為)
カプセル化
上記の様にアクセス修飾子でクラス、メンバ変数、メソッドの公開範囲を指定出来るようにする事をカプセル化と言う。
カプセル化の要件
① メンバ変数を「private」にして隠す。(他のクラスから利用できないようにする)
② メンバ変数の値を取得・設定する「public」のメソッドを用意する。
メリット
①private修飾子を利用して外部からの、直接アクセスでメンバ変数の変更を防ぐことができる。
②専用のアクセサメソッド(特定のオブジェクト内のクラスやフィールドを操作する際に、直接書き換えるのではなく専用のメソッドを通して操作を行うこと)を利用することで、外部からの間違ったアクセスを未然に防ぐことができる。
③使用者が内部構造を理解していなくても使用できる。
④アクセス修飾子で公開範囲が一目で分かる様になるのでメソッドの追加やプログラムの修正をどこまですれば良いのかが分かりやすくなる。
例文2
class StuSample5{
public static void main(String[] args){
Student5 stu1 = new Student5("菅原");
stu1.setScore(80);
stu1.display();
Student5 stu2 = new Student5("田仲");
stu2.setScore(-50);
//stu2.score = -50; ←Student5クラスでメンバ変数scoreはprivate指定されているのでエラーになる
stu2.display();
}
}
public class Student5{
private String name;
private int score;
public Student5(String n){
name = n;
}
public void setScore(int s){
if(0 <= s && s <= 100){
score = s;
} else {
System.out.println(name + "さんの点数が範囲外です");
score = 0;
}
}
void display(){
System.out.println(name + "さん" + score + "点");
}
}
菅原さん80点
田仲さんの点数が範囲外です
田仲さん0点
Student5クラスではsetScoreメソッドで0~100点以外の点数があれば"さんの点数が範囲外です"と出力されるようになっている。
もしint score;のprivate指定が無かったら実行用クラスのstu2.score = -50;が出力出来てしまう。
菅原さん80点
田仲さん-50点
private指定することでsetScoreメソッドを通してのみ値を代入させる事が出来る様になる。
参考記事