プログラミングⅡ 第8回 ---オブジェクト指向型 プログラミング パラダイム 第2回 ---今日の内容 変数 コンストラクタ ---変数の分類 メソッド内で定義 メソッド外で定義 ---メソッド内で定義 ローカル変数 Cと基本的に同じ 生存:メソッドの実行中 役割:メソッドの補助 ---メソッド外で定義 (class内) インスタンス変数 (メンバ変数) 生存:インスタンスと同じ 役割:インスタンスの状態・属性 ---インタンス変数の定義は クラス(class)で行うが 内容は インスタンスごとに独立 ---例 独立した名前を つけられるように Personクラスを拡張 ---interface [[PRE: 01: public interface Person { 02: public String greet(); 03: public void setName(String name); 04: } ]] メソッドsetNameを追加 ---class [[PRE: 01: public class Japanese implements Person { 02: private String name = "名無しの権兵衛"; 03: public String greet() { 04: return "こんにちは。私は" + this.name + "です。"; 05: } 06: public void setName(String name) { 07: this.name = name; 08: } 09: } ]] ---インスタンス変数に アクセスするとき this. をつけてもよい ---this. をつけなくて ローカル変数と 名前が重なったとき ローカル変数優先 ---インスタンス変数を 明示するために 名前が重ならなくても this. をつけるのがよい ---テスト実行用class [[PRE: 01: public class Main { 02: public static void main(String[] args) { 03: Person s = new Japanese(); 04: s.setName("川村 尚生"); 05: Person t = new Japanese(); 06: t.setName("山田 有里子"); 07: System.out.println(s.greet()); 08: System.out.println(t.greet()); 09: } 10: } ]] ---出力結果 こんにちは。私は川村 尚生です。 こんにちは。私は山田 有里子です。 ---オブジェクトsの インスタンス変数と オブジェクトtの インスタンス変数は 独立している ---オブジェクト指向型 パラダイムにおいて 変数に格納されるもの ↓ オブジェクトへの参照 (ポインタ) オブジェクトそのもの では[[EM:ない]] ---オブジェクトは new演算子によって [[EM:ヒープ]]に作られる 変数はヒープ内 オブジェクトへのポインタ (Cのポインタと違い演算不可) ---先の例を1箇所だけ変更 [[PRE: Main.java 05: Person t = new Japanese(); ]] ↓ [[PRE: 05: Person t = s; ]] ---出力結果 こんにちは。私は山田 有里子です。 こんにちは。私は山田 有里子です。 t.greet()はもちろん s.greet()も山田 有里子に! ---[[PRE: Person t = s]] コピーではない! 複数の変数(s,t)から 同じオブジェクトを参照 ---オブジェクト指向型 パラダイムにおいて 変数に格納されるもの ↓ オブジェクトへの参照 (ポインタ) ---Javaは純粋ではないので [[EM:プリミティブ型]]が存在する 変数に(Cなどと同様) 参照ではなく 値そのものが入る ---- プリミティブ型の種類 boolean char byte short int long float double ---プリミティブ型 以外を [[EM:参照型]] と呼ぶ ---参照型の変数に null を代入できる ↓ オブジェクトを 参照していない ---[[EM:コンストラクタ]] ---インスタンスは new演算子によって [[EM:ヒープ]]に作られる ---インスタンスが 作られるとき コンストラクタ が実行される ---[[EM:コンストラクタ]] classと同名で 返り値がない メソッド(のようなもの) ---コンストラクタに 引数を持たせてもよい インスタンスを 作るために 必要な情報を与える ---例 Japanese class [[PRE: 01: public Japanese(String name) { 02: this.setName(name); 03: } ]] ---デフォルト コンストラクタ ---コンストラクタを 明示的に作らない場合に 自動生成される 引数なし コンストラクタ ---コンストラクタを 明示的に作ると デフォルト コンストラクタは 作られない 必要なら 同等の物を作る ---例 Japanese class [[PRE: 01: public Japanese() { 02: } ]] ---引数の個数や型が違えば コンストラクタはいくつ 作ってもよい ---- 例 Japanese class [[PRE: 01: public Japanese(String family, String first) { 02: this.setName(family + " " + first); 03: } ]]
© Copyright 2024 ExpyDoc