this

コンストラクタを指定出来るクラスの作成において

渡される引数の数に応じて呼ばれるコンストラクタを変える場合

それぞれのコンストラクタを定義しなければならないわけだけども

 

たとえばオブジェクトのメンバが三つ有って

(名前、誕生日、満腹度)

デフォルトならnew Human();

全て呼び出すときに値を代入したいならnew Human("田中太郎", 19970904, 60);

と書くと思うけど

 

もし誤って満腹度の入力を忘れたら?

めんどくさくなって名前しか入力しなかったら

誕生日を入力し忘れてnew Human("田中太郎", 60);

だったらどうなるのか

 

そもそもこれがゲームのキャラクターで

満腹度が0だった場合出現した瞬間に死ぬとして

引数が名前だけ、あるいは名前が無くてもとりあえず満腹度があって

出現してほしかったり

 

こういった場合を想定してコンストラクタを定義しておく場合に

thisを使って効率よくコンストラクタを定義するのだけれども

 

Human(String name, int birthday, int manpuku) {

this.name = name;

this.birthday = birthday;

this.manpuku = manpuku;

}

Human(String name,int brthday) {

this(name, birthday, 60);

}

Human(String name) {

this(name, birthday, 0);

}

Human() {

this("不明");

}

となるらしい

一番上のコンストラクタでは名前、誕生日、満腹度が引数として渡されるため

こちらでメンバ変数を定義する必要は無い

 

しかし一つしたでは、満腹度が定義されていないためこちらで60と代入してやる

何のメンバ変数に代入するか?というのはthisによってHumanには三つの変数があるという定義が呼び出されるので大丈夫

 

そしてさらに一個下だが次は誕生日が欠けている

これは不明とでもいれたいがint型であるので0とする、nullでもいいのかな

満腹度が無いがthisによって上の60を代入する定義が呼び出される

 

最後に名前が無い場合は不明と代入して後はthisによって今までどおりとなるのか

 

これは多少自分でクラスを作ってコンストラクタを定義しないと覚えられないかもしれない

ゲームを作る場合にせよSwingやawtの全体がわからなくとも

パラメーターなんかは自分で作らないといけないわけだから

いまのうちに自分で作っておけるわけだ

 

Human(String job, int hp, int mp, int attack, int defence) {

this.job = job;

this.hp = hp;

this.mp = mp;

this.attack = attack;

this.defence = defence;

}

Human(String job, int hp, int mp, int attack) {

this(job, hp, mp, attack, 5)

}

Human(String job, int hp, int mp) {

this(job, hp, mp, 5);

}

Human(String job, int hp) {

this(job, hp, 20);

}

Human(String job) {

this(job, 50);

}

Human() {

this("無職");

}

 

こんなところだろうか

 

目が回る

コンストラクタ

コンストラクタを書かなくても

デフォルトコンストラクタが自動で代入されて

Stringならnull、intなら0になるが

 

例えばHumanオブジェクトを作るときに

後からメンバに値を代入しなければならないのに対して

コンストラクタ

Human() {

     this.name;

     his.birthday;

     this.manpuku = "50";   //満腹度を表すパラメーター

}

と、書いておけば新しいHumanオブジェクトを作った時

そのオブジェクトには自動で満腹度50が代入される

(名前と誕生日は手動で代入しなければならないが)

 

こうすることで同じパラメーター

例えばゲームなんかで体力100の敵をいっぱい出したい時なんかに

効率よく出現させられるのではないかと

 

しかしこうコンストラクタを書いておいても

デフォルトコンストラクタの呼び出しは可能らしい

 

のでnew Human();

 

でもいいし

 

new Human(田中太郎, 19970904);

でもいい

 

 

 

 

 

※メンバメソッド、呼び出し方メモ

void eat () {

     this.manpuku += 60;

}

 

Human human = new Human();

human.eat();

メンバ変数、他

オブジェクトの持つ情報……メンバ変数

Humanクラスのnameだとかbirthdayだとか

 

Human human = new Human();

human.name = "田中太郎";

human.birthday = 19970904;

 

しかしどうにも違うようで

Human human = new Human();

は、Humanオブジェクトの変数HumanをHumanクラス(設計図)を元に

作ったということ?頭がこんがらがる

 

そうして出来たのはインスタンスという

インスタンスの値=パラメータ&メンバ変数?

いや、Humanオブジェクトのメンバ変数humanなのか?

 

オブジェクトを表す変数名.メンバ
えっと……

インスタンス≒オブジェクトで
オブジェクトは全体、インスタンスは個別
個別のインスタンスをまとめたのがメンバ

オブジェクト

メンバ

インスタンス

か!なるほど

プロジェクト

パッケージ

クラス

クラスを元にオブジェクトができ

オブジェクト

インスタンス

メンバ(パラメーター?)

Human型の変数humanを宣言して
その変数humanにnewして作ったオブジェクトを代入する
こうして変数humanもHumanオブジェクトとして扱うことができる

こんなところか……

JAVAを勉強するついでに思ったことを

書いたり声に出したりしないと

オブジェクトとかパッケージの概念が頭に残らないと思うので

アナログ的なノートにまとめるといったことはめんどくさいので

ブログにまとめることにします。

 

一番上にプロジェクトがあって

次にソースフォルダ、パッケージ、クラス

 

プロジェクト

ソースフォルダ

パッケージ

クラス

 

人で例えると

人というパッケージがあって

人の中にも肌が白い人、黒い人が居るけれど

どちらにせよ名前や誕生日は絶対あるから

 

Brack_HumanパッケージのBrack_Humanクラスや

White_HumanパッケージのWhite_Huがあって情報が入ってればそれは

オブジェク卜である……ということ……?

 

クラスにあらかじめ値を代入しておくのは

プログラム的に二度手間になる可能性があったりする

 

Humanクラスには名前があるからnew.Human(x)って宣言したらXの名前の人を作ってね

とか設計図的な感じで考える

 

Human human = new Human();

 

実際にはこうしてHumanクラス(設計図)を利用したHumanを作るらしいのだけれども

Humanが多すぎてわかりづらい

 

型   名前(Alexとかでもいい)  新しい  人を作って

Human human =        new   Human();

 

噛み砕いた感じこうだと思う