Revised: Feb./14th/2003; Since: Sep./11th/2001
前節ではメソッドのオーバーロードを見てきました。コンストラクタもオーバーロードできます。・・・コンストラクタの項で、既に紹介済みですけどね。ここでは this() コンストラクタについて紹介します。
コンストラクタを明示的に定義しない場合、コンパイラによって、空のコンストラクタが追加されます。次のクラスを見てください。
class ConstructorDemo {
private int i, j;
void getMsg() {
System.out.println("i = " + i + ", j = " + j);
}
}
コンストラクタが記述されていません。こうすると、コンパイラが引数のないコンストラクタを自動的に作成してくれます。
次のように、一つでもコンストラクタを記述すると、コンパイラはデフォルトのコンストラクタを作ってくれなくなります。
class ConstructorDemo {
private int i, j;
// 明示的コンストラクタ
ConstructorDemo(int x, int y) {
i = x;
j = y;
}
void getMsg() {
System.out.println("i = " + i + ", j = " + j);
}
}
引数の異なるコンストラクタを複数記述する事ができます。
class ConstructorDemo {
private int i, j;
// 明示的コンストラクタ1
ConstructorDemo(int x, int y) {
i = x;
j = y;
}
// 明示的コンストラクタ2
ConstructorDemo(int x) {
i = x;
j = 1;
System.out.println("j はデフォルト値 1 を使います。");
}
// 明示的コンストラクタ3
ConstructorDemo() {
i = 1;
j = 1;
System.out.println("i, j はデフォルト値 1 を使います。");
}
void getMsg() {
System.out.println("i = " + i + ", j = " + j);
}
}
this() コンストラクタ同じクラス内のコンストラクタを this() メソッドで呼び出すことができます。先ほどの例を、次のように書くことができます。
class ConstructorDemo {
private int i, j;
// 明示的コンストラクタ
ConstructorDemo(int x, int y) {
i = x;
j = y;
}
// 明示的コンストラクタ
ConstructorDemo(int x) {
this(x, 1);
System.out.println("j はデフォルト値 1 を使います。");
}
// 明示的コンストラクタ
ConstructorDemo() {
this(1, 1);
System.out.println("i, j はデフォルト値 1 を使います。");
}
void getMsg() {
System.out.println("i = " + i + ", j = " + j);
}
}
自クラス内の別のコンストラクタは this() で呼び出せます。this() コンストラクタを使う場合は、コンストラクタ内の最初の行に記述しなければなりません。後続の章で説明する継承クラスにおける super() コンストラクタに似ています。