今回はJavaのコンストラクタについてまとめてみました。
目次
・そもそもコンストラクタとは
・コンストラクタが必要な理由とは
・コンストラクタの使用方法
・コンストラクタに情報を渡す方法
・他のコンストラクタを呼び出すには
Javaの勉強をやりだして、最初に頭がパンクした項目といえばコンストラクタです。現在僕は『Java SE8 Sirver』の資格を取得すべく、勉強しているところです。勉強用のテキストも後半に進んでします。しかし、なーんか頭の中がふわふわしていました。それでどこの部分の理解が弱いのかな?と思いテキストを振り返っていたのですが、コンストラクタだということがわかりました。
ということで、一旦整理したいと思います。
メインで読み込んでいる参考書とは別の参考書を入手して細かく調べていきました。コンストラクタの概要となぜ必要なのかというところを簡単にまとめてみました。ということで、内容に入っていきます。
■そもそもコンストラクタとは・・・
一言で表すと、インスタンスが新たに作られた後、自動的に実行される特別なメソッドです。
■コンストラクタが必要な理由とは・・・
Javaの初学者が簡単なプログラムを作っているレベルであれば考える必要はありません。最初は全くコンストラクタは考える必要はないです。テキストでも最初のころは全く出てこないのですね。
ただ、大規模な開発を行う場合、自分の作ったクラスを他人が使うことも考えられます。そのため、他人が自分の作ったクラスを使って、インスタンスを作成するときのことを考える必要が出てきます。
クラスを利用する他人からは、インスタンスを作成したときに、その利用したクラスのフィールドにどのような値を代入しなければいけないのかわからないのです。そのため、他人が思わぬ値で初期化するという場合もありえます。そのため、クラスを作るときは自分以外の開発者がそのクラスを利用することも考えて作成しないといけないわけです。
そこで、どうすればいいのかというと、コンストラクタを利用するタイミングが出てきます。コンストラクタを利用することによって、インスタンスが生成されたときに、フィールドの値を好きな値で初期化することができます。または、好きな値ではなく、毎回異なる値を代入することも可能です。その場合は、引数を受け取って初期化するなどの設定をすることができます。
■コンストラクタの使用方法
Javaでは2つの条件を満たすメソッドだけがコンストラクタと見なされて、自動実行されるようです。
①メソッド名がクラス名と完全に等しいとき
②メソッド宣言に戻り値が記述されていないとき(voidも不可)
キャラクターを作るCharacterクラスを作成し、その中にコンストラクタを設定してみます。
例
public class Character {
int hp;
String name;
Character () {
this.hb = 500;
}
}
このCharacter()メソッドはコンストラクタとして定義されています。newされると自動的に実行されてHPに500が代入されます。そのため、mainメソッドでHPに初期値を代入する必要はないのです。
注意点として、コンストラクタはプログラマが直接呼び出すことはできません。あくまでnewしてインスタンを生成し、それによって、間接的にCharacter()が実行されるということになります。mainメソッドからa.Character();のようにコンストラクタを直接呼び出すことはできません。
■コンストラクタに情報を渡す方法
今度はCharacterクラスのフィールドの名前について考えます。HPは固定の値で初期化すればよいため単純なコンストラクタで済みましたが、名前はそのキャラクタによって異なるはずです。このような場合は、コンストラクタが毎回異なる追加情報を引数で受け取れるように宣言すればいいです。
例
public class Character {
:
Character(String name) {
this.hp = 500;
this.name = name;
}
}
コンストラクタに引数を受け取るようにしました。これでnewするときに名前の初期化も指定することができるようになりました。引数をどうやって渡せばいいのかについては、newするタイミングで渡します。下記のように、コンストラクタに初期値の名前を渡しています。
例
Character a = new Character(“ ハゲマント”);
また、コンストラクタにはオーバーロードを利用することもできますので、引数を渡す場合と渡さない場合も作っておくと、簡単なテストをしたいときに便利となります。
■ほかのコンストラクタを呼び出すには
2つ以上のコンストラクタを定義していると、同じ処理を記述することも出てくるかもしれません。
例えば下のようなコードの場合
public class Character {
:
Character (String name) {
this.hp = 500;
this.name = name;
}
Character () {
this.hp = 500;
this.name = “さいたま”;
}
}
このコードはHPにそれぞれ500を代入しています。この場合、もしHPの値を変更することになったら、どちらのコンストラクタも変更しないといけなくなります。しかし、コンストラクタを直接呼び出すことはできません。
いい方法はないのか。。あります。特別な呼び出し方でコンストラクを呼び出した場合に限って、許されます。下記のような専用の記述方法を使った場合に限って特別に許されます。
this(引数);
例
Character (String name) { //コンストラクタ1
this.hp = 100;
this.name = name;
}
Character () { //コンストラクタ2
this(“さいたま”); ←コンストラクタ1を呼び出す
}
thisとはまたややこしのですが、これでコンストラクタ1を呼び出すことができるようになりました。これでHPを変更するときは、コンストラクタ1の値だけ変更すればいいことになります。変更がとても楽になりました。
今回は簡単にまとめてみました。
僕も初学者ですからもし内容が間違っていたら教えてください(^^;)
次は抽象化でもまとめてみようかなと思います。
以上
ではまた(^^)