今回の記事ではコンストラクタのオーバーロードについて解説していきます!
「そもそもオーバーロードってなに?」という方はオーバーロードについて解説した記事もあるので、そちらを先に読んでみてください!
そもそもコンストラクタってなに?
コンストラクタのオーバーロードについて解説する前にまずはコンストラクタについて少しだけ解説します。
「コンストラクタなんて知ってるよ!」
という優秀な方はここは読み飛ばしてください。
コンストラクタについてはコチラの記事でも詳しく解説しているので、参考にしてみてください!
インスタンス生成時に実行されるメソッドみたいなやつ
コンストラクタとはクラスのインスタンスを生成した時に実行されるメソッドのようなものです。
戻り値話で、クラス名と同じ名前を定義することで、コンストラクタと認識されます。
「インスタンス化ってなんだよ!」
という方はこちらの記事も参考にしてみてください。
サンプルプログラム
サンプルで確認してみましょう。Bookクラスを作成しました。
このBookクラスは本のタイトルを保持するtitleと値段を保持するpriceというフィールドを持っています。
そして引数のないコンストラクタも用意しました。
public class Book {
private String title;
private int price;
public Book(){
System.out.println("Bookクラスのコンストラクタが実行されたよ!");
}
}
上記のBookクラスをインスタンス化してみます。
public class Main {
public static void main(String[] args) {
// Bookクラスをインスタンス化
Book book = new Book();
}
}
実行すると次のようにコンストラクタが実行されることがわかります。
Bookクラスのコンストラクタが実行されたよ!
コンストラクタのオーバーロード
さてここからは本題のコンストラクタのオーバーロードについて解説していきます。
オーバーロードは同じメソッド名で、引数の数・型・順番のいずれかが違うものを宣言することです。
コンストラクタでも同じように引数の数・型・順番の違うものを複数宣言することが出来ます。
サンプルで確認
では実際のサンプルコードで確認していきましょう。
先程のBookクラスに引数ありのコンストラクタを追加しました。
public class Book {
private String title;
private int price;
/**
* 引数なしのコンストラクタ
*/
public Book(){
System.out.println("Bookクラスのコンストラクタが実行されたよ!");
}
/**
* 引数ありのコンストラクタ
*/
public Book(String title, int price) {
System.out.println("Bookクラスの引数ありコンストラクタが実行されたよ!");
this.title = title;
this.price = price;
}
public void showInfo() {
System.out.println("この本のタイトルは「" + title + "」で、値段は" + price + "円です。");
}
}
mainメソッドも少し書き換えて、引数なし、引数ありのコンストラクタをそれぞれ実行してみます。
public class Main {
public static void main(String[] args) {
// 引数なしのコンストラクタでBookクラスをインスタンス化
Book book1 = new Book();
// 引数ありのコンストラクタを使ってBookクラスをインスタンス化
Book book2 = new Book("僕は勉強ができない", 499);
book2.showInfo();
}
}
実行結果は次のようになります。
Bookクラスのコンストラクタが実行されたよ!
Bookクラスの引数ありコンストラクタが実行されたよ!
この本のタイトルは「僕は勉強ができない」で、値段は499円です。
このようにコンストラクタも引数の数・型・順番を変えることで複数のコンストラクタを定義することが出来ます。
コンストラクタのオーバーロードを使うことで、状況によって適切なコンストラクタを使い分けることが可能になります。
thisを使って別のコンストラクタを呼び出す
コンストラクタではthisを使うことで、別のコンストラクタを呼び出すこともできます。
Bookクラスの引数ありのコンストラクタの中身を次のように書き換えます。
this()を記述することで、引数なしのコンストラクタを呼び出しています。
/**
* 引数ありのコンストラクタ
*/
public Book(String title, int price) {
// thisで引数なしのコンストラクタを呼び出している
this();
System.out.println("Bookクラスの引数ありコンストラクタが実行されたよ!");
this.title = title;
this.price = price;
}
mainメソッドの中身を書き換えてみます。
public static void main(String[] args) {
// 引数ありのコンストラクタを使ってBookクラスをインスタンス化
Book book2 = new Book("僕は勉強ができない", 499);
book2.showInfo();
}
引数なしのコンストラクタはmainメソッドの中では呼んでいません。
しかしこれを実行すると次のように引数なしのコンストラクタの処理も呼ばれていることがわかります。
Bookクラスのコンストラクタが実行されたよ!
Bookクラスの引数ありコンストラクタが実行されたよ!
この本のタイトルは「僕は勉強ができない」で、値段は499円です。
まとめ
まとめです。
今回はコンストラクタのオーバーロードについて解説してきました。
コンストラクタは戻り値がなくて、クラス名と同じメソッドのようなものです。
コンストラクタはインスタンスを生成する際に実行されます。
このコンストラクタの引数の数・型・順番を入れ替えることで複数のコンストラクタを定義することが出来ます。
またコンストラクタから別のコンストラクタを呼び出すことも可能です。
コンストラクタのオーバーロードを理解し、実装できるようになることで実装の幅が広がります。
ぜひマスターして実装力を高めてください!