プログラミングⅡ 第8回 ---- オブジェクト指向型 プログラミング パラダイム

プログラミングⅡ
第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: }
]]