Java

【Java】コンストラクタのオーバーロード

オーバーロードとは

そもそもオーバーロードというのは同じクラス内に同じ名前のメソッドを定義できることです。ただし引数の数や型、順番などが違う必要があります。同じ名前の違う引数を受け付けることが可能になるので処理の幅が広がります。

同じクラス内に同じ名前のメソッドを定義できる!でも引数が違うから処理の内容も変えられる。

コンストラクタとは

コンストラクタというのはクラスをインスタンス化したときに実行されるメソッドのようなものです。大抵はクラスが持つ変数に値を代入してインスタンスの初期化を行う場合が多いです。

コンストラクタはクラスがインスタンス化されたときに最初に実行される!

 [temp id=2]

コードで確認

Bookクラスを作成

今回は例としてシンプルなBookクラスを作成してみます。Bookクラスは本のタイトルであるbookTitleと値段であるpriceをフィールドとして持ちます。Bookクラスのコンストラクタは二つ用意しました。値段の値だけ受け取った場合、同じクラス内のbookTitleも初期化するコンストラクタを呼びます。「this」を使うことで別の引数を持ったコンストラクタを呼び出すことができます。thisの引数としてString型とint型の値を渡しているのでそれと合致した引数を受け取るコンストラクタが自動で呼び出されます。今回の例ではbookTitleは「default book title」としました。mainメソッドを持つクラスを作成して動作確認してみます。

class Book {
	String bookTitle;
	int price;

	Book(int price) {
		this("default book title", price);
	}

	Book(String bookTitle, int price) {
		this.bookTitle = bookTitle;
		this.price = price;
	}
}

mainメソッドを作成

クラス名は適当にOverloadTestとしました。メインメソッド内でBookクラスのインスタンスを二つ作成しました。一つは本のタイトルと値段を指定して初期化していますが、二つ目は本のタイトルは指定せず値段だけ渡しました。それぞれのインスタンスのタイトルと値段を出力してみると一つは指定したタイトと値段が出力され、もう一つはタイトルを指定していないため「default book title」と出力されます。

class OverloadTest {
	public static void main(String[] args) {
		Book book1 = new Book("サピエンス全史", 1500);
		Book book2 = new Book(1000);

		System.out.println("本のタイトル:" + book1.bookTitle);
		System.out.println("本の値段:" + book1.price);
		System.out.println();
		System.out.println("本のタイトル:" + book2.bookTitle);
		System.out.println("本の値段:" + book2.price);

	}
}

このようにコンストラクタをオーバーライドして複数用意することでインスタンス化したときの一貫性を保つことができます。

 [temp id=2]

いろいろ試してみる

ここからは完全に遊びになりますが、いろいろコードをいじってみます。

まずはBookクラスはそのままでmainメソッドをいじってみます。タイトルのみを指定してインスタンス化を試みます。

class OverloadTest {
	public static void main(String[] args) {
		Book book1 = new Book("サピエンス全史", 1500);
		Book book2 = new Book(1000);
		Book book3 = new Book("論語と算盤");

		System.out.println("本のタイトル:" + book1.bookTitle);
		System.out.println("本の値段:" + book1.price);
		System.out.println();
		System.out.println("本のタイトル:" + book2.bookTitle);
		System.out.println("本の値段:" + book2.price);
		System.out.println();
		System.out.println("本のタイトル:" + book3.bookTitle);
		System.out.println("本の値段:" + book3.price);

	}
}

これをコンパイルしようとするとエラーとなります。これはString型のみを受け取るコンストラクタがBookクラスには用意されていないために起こるエラーです。よってBookクラスにString型のみを受け取るコンストラクタを用意することで解決できます。

Book(String bookTitle) {
		this(bookTitle, 1000);
}

オーバーロードは引数の順番を変えることでも実装できるのでこのようにString型とint型の引数の順番を逆にしたものを作ることもできます。

Book(int price, String bookTitle) {
	this(bookTitle, price);
}

mainメソッドに以下の文を追加して動作確認してみるとちゃんと動くと思います。インスタンス化するときに渡している順番がint型、String型の順序になっていますが、先ほどその順番と同じコンストラクタを作ったのでしっかりと動きます。

Book book4 = new Book(1800, "失敗の本質");
System.out.println("本のタイトル:" + book4.bookTitle);
System.out.println("本の値段:" + book4.price);

-Java