簡単にまとめました。
コンストラクターとは
- インスタンス化のタイミングで呼び出される特殊なメソッド
- コンストラクターではメンバー変数の初期化など、事前処理系を記述するのが一般的
とりあえず、以下サンプルコードを実行します。
public class Person {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
this("えんどうゆうき", 27);
}
public void show() {
System.out.printf("%s(%d歳)です。\n", this.name, this.age);
}
}
public class ConstructorBasic {
public static void main(String[] args) {
var p = new Person();
p.show();
}
}
えんどうゆうき(27歳)です。
正常に処理できました。
ここでオーバーロードしたコンストラクターの引数を変更すると実行結果が異なります。
public Person() {
this("えんどうゆず", 10);
}
実行結果
えんどうゆず(10歳)です。
オーバーロードしたコンストラクターでthisキーワードを使用したコンストラクター呼び出しを記述しない場合、実行結果は以下になります。
public Person() {
}
null(0歳)です。
これはメンバー変数がゼロ値を持つためです。※ローカル変数は初期化が必須です。
それならコンストラクターのオーバーロードをしなくてもエラーにならない?と思いましたが、以下のようなエラーが出ました。
public class Person {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
/*
* public Person() { this("えんどうゆず", 10); }
*/
public void show() {
System.out.printf("%s(%d歳)です。\n", this.name, this.age);
}
}
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
コンストラクター Person() は未定義です
しかし以下であればエラーにはなりません。
public class Person {
public String name;
public int age;
/*
* public Person(String name, int age) { this.name = name; this.age = age; }
*
* public Person() { this("えんどうゆず", 10); }
*/
public void show() {
System.out.printf("%s(%d歳)です。\n", this.name, this.age);
}
}
null(0歳)です。
これはデフォルトコンストラクターが暗黙的に生成されているからですね。
引数有のコンストラクターのみを定義している場合、コンストラクターは存在するという判定でデフォルトコンストラクターが生成されず、呼び出し可能なコンストラクターが存在しないという判定でエラーになるんでしょう。
なのでコンストラクターの引数を取り除けばエラーにはなりません。メンバー変数のゼロ値を参照しています。
public class Person {
public String name;
public int age;
public Person() {
this.name = name;
this.age = age;
}
public void show() {
System.out.printf("%s(%d歳)です。\n", this.name, this.age);
}
}
null(0歳)です。
引数有のコンストラクターを記述し、オーバーロードして引数を渡す流れがスタンダードでしょうね。
参考文献
独習Java 新版