今回やること
コンストラクタは、newでオブジェクトを作る時にフィールドを初期化する特別な処理です。商品名と価格を持つProductを、作成直後から使える状態にします。
前提: Java入門 #12 - クラスとオブジェクトで、フィールド、メソッド、
newを学んでいること。
new Product("ノート", 300)
↓ コンストラクタ
name="ノート", price=300 のオブジェクト
1. コンストラクタを定義する
コンストラクタはクラス名と同じ名前で、戻り値の型を書きません。
class Product {
String name;
int price;
Product(String name, int price) {
this.name = name;
this.price = price;
}
}
void Product(...)と書くと、コンストラクタではなく戻り値のないメソッドになります。
2. thisでフィールドを示す
this.name = name;
左のthis.nameは作成中のオブジェクトのフィールド、右のnameはコンストラクタが受け取った引数です。
| 部分 | 値 |
|---|---|
this.name | オブジェクトに保存する商品名 |
name | newの呼び出し元から受け取った値 |
引数とフィールドを同じ分かりやすい名前にし、thisで区別する書き方がよく使われます。
3. newで初期化する
Product notebook = new Product("ノート", 300);
newがメモリ上にオブジェクトを作り、続けて引数2個のコンストラクタを呼びます。呼び出しに合うコンストラクタがなければコンパイルエラーです。
4. 初期値違いをオーバーロードする
価格をまだ決めていない商品用に、引数1個のコンストラクタを追加します。
Product(String name) {
this(name, 0);
}
this(name, 0)は同じクラスの引数2個のコンストラクタを呼びます。初期化処理を重複させず、価格だけ既定値0にします。this(...)はコンストラクタの最初の文に置きます。
完成コードを動かす
ConstructorDemo.javaとして保存します。
class Product {
String name;
int price;
Product(String name, int price) {
this.name = name;
this.price = price;
}
Product(String name) {
this(name, 0);
}
void showInfo() {
System.out.println(name + ": " + price + "円");
}
}
public class ConstructorDemo {
public static void main(String[] args) {
Product notebook = new Product("ノート", 300);
Product undecided = new Product("新商品");
notebook.showInfo();
undecided.showInfo();
}
}
javac ConstructorDemo.java
java ConstructorDemo
| 呼び出し | 選ばれるコンストラクタ | price |
|---|---|---|
new Product("ノート", 300) | 引数2個 | 300 |
new Product("新商品") | 引数1個から2個へ委譲 | 0 |
成功確認
ノート: 300円
新商品: 0円
どちらの作り方でも、オブジェクト作成直後にnameとpriceが入っていれば成功です。
デフォルトコンストラクタの注意
コンストラクタを1つも書かない時だけ、Javaは引数なしのデフォルトコンストラクタを自動で用意します。引数付きコンストラクタを1つでも書くと、new Product()は自動では使えません。必要なら引数なし版を明示して、どんな初期状態を許すか決めます。
よくあるつまずき
コンストラクタへ戻り値の型を書く
コンストラクタにはvoidもintも書きません。クラス名と同じ名前にします。
name = nameと書く
引数へ同じ値を代入するだけです。フィールドへ入れるにはthis.name = nameと書きます。
this()を途中へ書く
別コンストラクタを呼ぶthis(...)は、コンストラクタの最初の文でなければなりません。
練習
本を表すBookにtitleとpagesを持たせます。引数2個のコンストラクタと、ページ数を100にする引数1個のコンストラクタをthis(...)で作ってください。
次のステップ
Java入門 #14 - Scannerで、利用者が入力した値からオブジェクトを作る準備をします。