カプセル化は、クラスにフィールド(変数)とメソッド(処理)を閉じ込めること

 

カプセル化のイメージ

 

他クラスから自クラスの変数を勝手にいじられては困るんで

変数は他クラスから見えないようにするよ

変数を参照するときはgetterメソッドを通してくれ

変数を書き換えるときはsetterメソッドを通してくれ

 

・フィールド・・・privateで修飾する

 privateは同一クラス内のメソッドからのみアクセス可能

 他クラスはprivate変数にアクセス不可

 

・メソッド・・・publicで修飾する

 他クラスからのアクセス用メソッドを作る

 フィールドに値をセットするメソッド(setterメソッドと呼ぶ)

 フィールドの値を返すメソッド(getterメソッドと呼ぶ)

 

■コード

public class Test {
    public static void main(String[] args) {
        Test2 t2 = new Test2();
        t2.setName("佐藤");
        System.out.println(t2.getName());
    }
}

class Test2 {
    private String name;
    public void setName(String s) {
        this.name = s;
    }    
    public String getName() {
        return this.name;
    }
}

■実行結果

佐藤

 

■コードの解説

1.mainメソッド(エントリーポイント)実行

  public static void main(String[] args) {

 

2.Test2クラスをインスタンス化

  Test2 t2 = new Test2();

 

3.Test2クラスのsetterメソッドでTest2クラスのname変数に佐藤をセット

  t2.setName("佐藤");

 

 Test2クラスのname変数はprivateなのでTest2.nameで直接アクセス不可

 (直接アクセス不可=Test2.nameと書くとコンパイルエラー)

    class Test2 {
        private String name;

 

 Test2クラスのsetterメソッドはpublicなのでアクセス可能

 Test2クラスのsetterメソッドに名前を渡して、Test2クラスのname変数に名前をセット

 

  ・setterメソッド

   引数(String s)で受け取った佐藤をTest2クラスのname変数にセット

    public void setName(String s) {
        this.name = s;
    } 

 

4.Test2クラスのgetterメソッドでTest2クラスのname変数の値を取得して出力

        System.out.println(t2.getName());

 

  ・getterメソッド

  Test2クラスのname変数の値を返却

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

<備考>

フィールド変数をpublicで修飾すれば他クラスから直接アクセス可能

カプセルから薬が筒抜けだがコードは短い

 

 Test2クラス

  修飾子をprivateからpublicに変更

    private String name; → public String name;

 

 Testクラス

  setterメソッドを使わず直接他クラスの変数にアクセス

    t2.setName("佐藤"); → t2.name = "佐藤";

 

■コード

public class Test {
    public static void main(String[] args) {
        Test2 t2 = new Test2();
        t2.name = "佐藤";
        System.out.println(t2.name);
    }
}

class Test2 {
    public String name;
}

 

■実行結果

佐藤