Chapter 14

アクセス修飾子・カプセル化

KeitoYuasa
KeitoYuasa
2023.02.18に更新
このチャプターの目次

1ファイル複数のクラスを定義できる。
しかし、public指定のクラスは1ファイル1つしか定義できない。
また、public指定クラスを定義した場合、そのソースファイル名はpublic指定したクラス名と同じでないと実行エラー

アクセス修飾子

アクセス修飾子 クラス コンストラクタ メンバ変数 メソッド アクセス範囲
public どのクラスからでも利用可能
protected × 同一クラス、同一パッケージ内のクラス、サブクラスのみ利用可能
デフォルト(指定なし) 同一クラス、同一パッケージのみ利用可能
private × 同一クラスのみ利用可能

※サブクラスは、パッケージが異なるクラスにも当てはまる。

No. 注意点
1 クラス宣言時のみprotected, privateアクセス修飾子を使用できない。
2 ローカル変数は、すべてのアクセス修飾子を利用できない。(コンストラクタ、メソッドの値を管理するもので外から使うものではないので)

以下では、アクセス修飾子を用いた例を示す。
コメントアウトしているところは、private指定されたインスタンス変数に別のクラスからアクセスしようとしているため、コンパイルエラー。

Training.java
class Test{
    private int num; //インスタンス変数にprinvate
    public Test(int i){num = i;} //コンストラクタにpublic
    public int getNum(){return num;} //メソッドにpublic
}

class Training {
    public static void main(String[] args){
        Test t = new Test(100);

        //System.out.println(t.num); コンパイルエラー
        System.out.println(t.getNum());

    }
}

//出力結果:100

カプセル化

  • カプセル化:メンバ変数とメソッドを一体化させて表現することをカプセル化と呼ぶ。

javaでは、インスタンス変数とメソッドの定義によってカプセル化を実現している。

No. 要点
1 外部のクラスからインスタンスがむやみに変更されることを防ぐために、インスタンス変数はprivate指定メソッドはpublic指定することが一般的に推奨されている。
2 インスタンス変数の値を変更したい場合は、それを更新するメソッドを定義すること。定義しない場合は、インスタンス化時からインスタンス変数の値が永遠と変わることがない。(このようなオブジェクトを不変オブジェクトと呼ぶ。)
3 static変数は、インスタンス変数とは用途が違うのでpublic指定でもいい。

以下では、カプセル化の例を示す。
インスタンス変数は、private指定されているので、外部クラスからは使用できない。
つまり、インスタンス化時に設定される値から変更することができない。(= 不変オブジェクト)

Training.java
class Test{
    private final String name;
    private final int id;

    public Test(String s, int i){
        this.name = s;
        this.id = i;
    }

    public String getName(){
        return this.name;
    }

    public int getId(){
        return this.id;
    }
}

class Training {
    public static void main(String... a){
        Test t = new Test("tanaka", 1);

        // t.name = "sato";
        System.out.println(t.getName());
        System.out.println(t.getId());

    }
}

//出力結果:
//tanaka
//1