補足といっても、内容は非常に重要なため、しっかり理解しておきたい。
コンストラクタとは…
new と同時に(インスタンス化)、実行されるメソッドのこと。
定義の決まりごとは
・メソッド名がクラス名と一致
・戻り値を記述しない
(コンストラクタが実行される際に渡して欲しい引数を、newするときに指定すればよい)
package blog;
public class Tomomi {
int age;
int mana;
// インスタンス化(new)された直後に実行される処理を書いたメソッド
Tomomi(){
this.mana = 20;
System.out.println("起きてすぐのマナの残量は"+ this.mana + "です");
}
// 引数を受け取る
void study(int time){
this.mana -= time;
System.out.println("勉強して、マナが"+ this.mana + "になった" );
}
// 引数を受け取る
void sleep (int time){
this.mana += time;
System.out.println("寝て、マナが"+ this.mana + "になった" );
}
}
package blog;
public class main {
public static void main (String []args){
// インスタンス化
Tomomi t = new Tomomi();
// 引数を渡して、呼び出して実行
t.study(9);
t.sleep(7);
}
}
Tomomi クラスの
Tomomi( ) {
}
が、コンストラクトになっている。
これを見て、わかるように、コンストラクタは、mainクラスから、
newされるときに必ず最初に自動で実行される。
他のメソッドのように、直接呼び出すメソッドではない。
ただ、直接、情報を渡すこともできる。
定義の決まりごとの部分に、少し書いてある
「コンストラクタが実行される際に渡して欲しい引数を、newするときに指定すればよい」
これが、どういうことか実際にみてみると
package blog;
public class Tomomi {
int age;
int mana;
// インスタンス化(new)された直後に実行される処理を書いたメソッド
// newする際に、int型の引数を受け取る
Tomomi(int mana){
// 受け取った引数を フィールド変数 mana に代入
this.mana = mana;
System.out.println("起きてすぐのマナの残量は"+ this.mana + "です");
}
// 引数を受け取る
void study(int time){
this.mana -= time;
System.out.println("勉強して、マナが"+ this.mana + "になった" );
}
// 引数を受け取る
void sleep (int time){
this.mana += time;
System.out.println("寝て、マナが"+ this.mana + "になった" );
}
}
package blog;
public class main {
public static void main (String []args){
// インスタンス化して、コンストラクタに情報を渡す
Tomomi t = new Tomomi(20);
// 引数を渡して、呼び出して実行
t.study(9);
t.sleep(7);
}
}
実行結果はさきほどと、変わらない。
■コンストラクタのオーバーロード■
上の例を見返してみる。
Tomomiクラスは、int型の引数を1つ受け取るように定義されている。
(int型の引数が必ず必要!!)
しかし、同じ名前のクラスを、同時に定義できる。
以前、学んだ、オーバーロードを使う。
package blog;
public class Tomomi {
int age;
int mana;
// インスタンス化(new)された直後に実行される処理を書いたメソッド
// newする際に、int型の引数を受け取る
Tomomi(int mana){
// 受け取った引数を フィールド変数 mana に代入
this.mana = mana;
System.out.println("起きてすぐのマナの残量は"+ this.mana + "です");
}
// 引数を受け取らない
Tomomi(){
this.mana = 10;
System.out.println("普段のマナの残量は" + this.mana + "です");
}
// 引数を受け取る
void study(int time){
this.mana -= time;
System.out.println("勉強して、マナが"+ this.mana + "になった" );
}
// 引数を受け取る
void sleep (int time){
this.mana += time;
System.out.println("寝て、マナが"+ this.mana + "になった" );
}
}
package blog;
public class main {
public static void main (String []args){
// インスタンス化
// 引数がないので、引数を受け取らないコンストラクタが呼び出される
Tomomi t = new Tomomi();
// 引数を渡して、呼び出して実行
t.study(9);
t.sleep(7);
}
}
また、クラスは、インスタンス化するときに、何かしらのコンストラクタを実行する。
が、特例がある。
クラスに1つもコンストラクタが定義されていない場合は、
「引数なし、処理内容なし」のコンストラクタの定義が自動的に追加される。
(クラスとインスタンスのときに書いていたものが、これに該当する)
■コンストラクタから、別のコンストラクタを呼び出す■
重複する処理を使いたい場合など、別のコンストラクタから呼び出すことができる。
package blog;
public class Tomomi {
int age;
int mana;
String name;
// インスタンス化(new)された直後に実行される処理を書いたメソッド
// newする際に、int型の引数を受け取る
Tomomi(String name){
// 受け取った引数を フィールド変数 mana に代入
this.mana = mana;
this.name = name;
System.out.println("起きてすぐのマナの残量は"+ this.mana + "です");
System.out.println(this.name + "1");
}
// 引数を受け取らない
Tomomi(){
// Tomomi(String name)のほうのコンストラクタを呼び出す
this("ともみ");
this.mana = 10;
System.out.println("普段のマナの残量は" + this.mana + "です");
System.out.println(this.name + "2");
}
}
package blog;
public class main {
public static void main (String []args){
// インスタンス化
// 引数がないので、引数を受け取らないコンストラクタが呼び出される
Tomomi t = new Tomomi();
}
}
わかりやすいように、コンストラクタの中の実行文に数字を入れた。
this("ともみ")
で、1つ目のコンストラクタは文字列「ともみ」を受け取って実行している。
注意点は
thisの後にクラス名ではなく、引数を書く!!



0 件のコメント:
コメントを投稿