カプセル化は、クラスにフィールド(変数)とメソッド(処理)を閉じ込めること
カプセル化のイメージ
他クラスから自クラスの変数を勝手にいじられては困るんで
変数は他クラスから見えないようにするよ
変数を参照するときは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;
}
■実行結果
佐藤