コンストラクタ

この節の要点

  • クラスからnew を使ってオブジェクトを作成する時、コンストラクタとよばれる特殊なメソッドが呼び出される。
  • コンストラクタはオブジェクト内のフィールドの初期化などを目的としたメソッドである。
  • thisキーワードは、インスタンスメソッド内で、呼び出したオブジェクトそれぞれのフィールドやメソッドを指し示す際に使う。

クラスからオブジェクトを生成するにあたって、オブジェクト内のデータを初期化することを目的として用意されている特殊なメソッドをクラスに定義できます。このメソッドをコンストラクタと呼びます。

図13にコンストラクタを定義したクラス例を示します。 返り値の型が無いクラスと同じ名前のメソッドがコンストラクタです。

public class Hello {

	/**
	 * Helloクラスのコンストラクタ
	 */
	public Hello() {

		System.out.println("こんにちは");
	}
}
図13:引数なしコンストラクタを含むクラス例
public static void main(String[] args) {

	System.out.println("オブジェクトの作成前");

	Hello echo = new Hello();

	System.out.println("オブジェクトの作成後");
}
図14:図9で示すクラスの呼び出し例

図13に示すプログラムのコンストラクタを取り出すと、図15になります。

public Hello() {

	System.out.println("こんにちは");
}
図15:図13におけるコンストラクタ

コンストラクタの実行イメージ\label{fig:constructorabstraction}

図16:コンストラクタの実行イメージ

コンストラクタは、図16に示す通り、new演算子を使ってクラスからオブジェクトを生成した直後に実行されます。つまり、図15における5行目の命令実行のタイミングでコンストラクタが実行されます。 この図13、図14のプログラムを実行すると、出力タブに図17のテキストが表示されます。

オブジェクトの作成前
こんにちは
オブジェクトの作成語
図17:図13、図14のプログラムの実行結果

また、コンストラクタは図18の例のように、引数付きで定義することもできます。

public class User {

	private String familyName;
	private String firstName;

	public User(String familyName, String firstName) {

		this.familyName = familyName;
		this.firstName = firstName;
	}

	public String getUserName() {

		return this.familyName + " " + this.firstName;
	}
}
図18:引数ありコンストラクタを含むクラス例
public static void main(String[] args) {

	User u = new User("Tanaka", "Taro");

	System.out.println(u.getUserName());
}
図19:図13のクラスの呼び出し例

図18のUserクラスは、ユーザデータを表す概念です。この場合、図19の3行目のようにオブジェクト生成をする際に引数を渡す必要があります。

public User(String familyName, String firstName) {

	this.familyName = familyName;
	this.firstName = firstName;
}
図20:図13における引数ありコンストラクタ

ここで、図17のコンストラクタ定義を見ると、this キーワードを使っています。thisキーワードは、クラスのメソッド内で使うことができる特殊なキーワードです。

このthisキーワードは、個々にnewで作成したオブジェクトそのものを示します。従って、図20のようにオブジェクトが持つメソッドやフィールドをthisキーワードにピリオドを介して呼び出すことができます。

thisキーワードの利用イメージ(引数ありコンストラクタでの利用例)\label{fig:thisabstraction}

図21:thisキーワードの利用イメージ(引数ありコンストラクタでの利用例)

ここで、thisキーワードを省略した場合も同様にオブジェクトが持つメソッドやフィールドを呼び出すことになります。しかし、メソッド引数名とフィールド名が重複していた場合、メソッド引数の呼び出しが優先されるため、同名のフィールドを呼び出す場合はthisキーワードを介して呼び出す必要があります。