導入
前のレッスンでは、インスタンスを作ったあとに pochi.name = "ポチ" と名前を設定しました。でも「名前のない犬」が一瞬でも存在してしまいます。生成と同時に初期化する コンストラクタ を使いましょう。
説明
コンストラクタ は、new したときに自動で呼ばれる特別なメソッドです。クラス名と同じ名前 で、戻り値の型を書きません。
public class Main {
public static void main(String[] args) {
Dog pochi = new Dog("ポチ", 3);
pochi.introduce();
Dog taro = new Dog("タロー", 5);
taro.introduce();
}
}
class Dog {
String name;
int age;
Dog(String name, int age) { // コンストラクタ(クラス名と同じ・戻り値なし)
this.name = name;
this.age = age;
}
void introduce() {
System.out.println(name + "(" + age + "歳)");
}
}
Dog(String name, int age) { ... }… コンストラクタ。new Dog("ポチ", 3)としたとき、"ポチ"と3が引数として渡されます。this.name = name;…thisは「今まさに作られているこのインスタンス自身」を指します。this.name(フィールド)に、引数のnameを代入しています。フィールドと引数が同じ名前のときに区別するため、this.をつけるのが定番です。
コンストラクタのおかげで、new Dog("ポチ", 3) の一行で「名前と年齢を持った犬」が確実に作られます。「未初期化の状態」を作らせないことが、安全なプログラムにつながります。
やってみよう
下のエディタを実行し、コンストラクタで名前と年齢がまとめて設定されることを確かめましょう。this. を外すとどうなるか(フィールドに代入されない)も試してみてください。
演習
Book クラスに String title と int price を持たせ、コンストラクタで両方を受け取って初期化してください。show() メソッドで タイトル: 800円 の形で表示し、main から new Book("Java入門", 800) を作って表示してください。
ヒント1を見る
Book(String title, int price) { this.title = title; this.price = price; }。
ヒント2を見る
show() の中で System.out.println(title + ": " + price + "円");。