コンストラクタの基本的な概念
コンストラクタとは
インスタンスの金型であるクラスに専用の文法を用いて記述することで、
その金型を用いてインスタンスを生成するごとに
その記述がインスタンスに自動で代入され、実行される処理のこと
なぜそのような仕組みが必要なのか?
ex.既に定義してあるHeroクラスという金型からHPが100の2人の勇者を生成する
class Main{
public static void main(String[ ] args){
Hero h1=new Hero( ); //Heroインスタンスの生成
h1.name="太郎"; //Heroインスタンスに情報をつけていく
h1.hp=100;
Hero h2=new Hero( );
h2.name="次郎";
h2.hp=100;
}
あるクラスを用いて作成するインスタンスの全てのhpを共通で同じ値にしたいなら、
クラス定義の時点で決めるだけで勝手に代入してくれた方が楽
(何度もh.hp=100;を記述するのは面倒)
→そこで出来たのがコンストラクタという仕組み
〈コンストラクタの基本構文〉
クラス名と同じ名前( ){
//ここに自動でインスタンスに代入して欲しい動作を記述
}
ルール ・クラス名と必ず一緒にすること
ex.Heroインスタンスを作成するために必要な金型 Heroクラスの定義
class Hero{
属性 int hp;
String name;
コンストラクタ Hero( ){
this.hp=100;
}
}
これでmainメソッドでインスタンスを作成した時に、hpに値を代入する記述をしなくても hp=100が勝手に代入される
※ちなみにブロックの外側のフィールド int hpを指しているので、thisを記述している
class Main{
public static void main(String[ ] args){
Hero h=new Hero( ); //勇者を1人作成
//HPの値を代入してないが、HPの値を試しに出力させてみる
System.out.println(h.hp);
}
出力結果 100 ←コンストラクタで指定した値が出力される
※
コンストラクタはプログラマがメソッドのように呼び出しの記述を書かなくても、
勝手に実行される
・・・役割は全く違うが記述方法はそっくり〉
1.名前がクラス名と完全に等しいかどうか
コンストラクタは名前がクラス名と等しい
2.宣言に戻り値が記述されているかどうか
コンストラクタは戻り値を宣言してはいけない
(戻り値なしという意味ののvoidの記述があるのもだめ)
ちなみに
コンストラクタの役割 (情報)
→インスタンス作成時に自動的にインスタンスのフィールドにあらかじめクラスの定義の際に決めていた値を代入してくれる
メソッドの役割 (動作)
→実際のインスタンスの動き方を指示する