Java コンストラクタオーバーロード完全解説:実践コード例付き
Java のコンストラクタとは?
コンストラクタ は、メモリ割り当て直後に新しく作成されたオブジェクトを初期化する特殊なメソッドです。オブジェクトのフィールドを望ましい値に設定し、省略時はデフォルト値が割り当てられます。コンストラクタの定義は任意で、提供しない場合はコンパイラが標準デフォルト値を割り当てるデフォルトコンストラクタを供給します:
- 数値プリミティブ(int、double 等)→ 0
- char → '\0'
- オブジェクト参照 → null
このチュートリアルでは以下をカバー:
- コンストラクタ作成のルール
- コンストラクタオーバーロード
- コンストラクタチェーン
Java コンストラクタ作成のルール
- コンストラクタ名はクラス名と完全一致しなければならない
- 戻り値型を持てない(
voidも不可)
例 1 – 最初のコンストラクタ
ステップ 1: 以下のコードを Java エディタに入力。
class Demo {
int value1;
int value2;
Demo() {
value1 = 10;
value2 = 20;
System.out.println("Inside Constructor");
}
public void display() {
System.out.println("Value1 === " + value1);
System.out.println("Value2 === " + value2);
}
public static void main(String[] args) {
Demo d1 = new Demo();
d1.display();
}
}
ステップ 2: コンパイルして実行。出力:
Inside Constructor Value1 === 10 Value2 === 20
Java のコンストラクタオーバーロード
Java では、異なるパラメータリストを持つ複数のコンストラクタをクラスに定義できます。コンパイラはパラメータの数と型でそれらを区別します。
Account クラスの有効なコンストラクタ例:
Account(int a); Account(int a, int b); Account(String a, int b);
例 2 – オーバーロードされたコンストラクタ
ステップ 1: 以下のコードを挿入。
class Demo {
int value1;
int value2;
/* Demo() {
value1 = 10;
value2 = 20;
System.out.println("Inside 1st Constructor");
} */
Demo(int a) {
value1 = a;
System.out.println("Inside 2nd Constructor");
}
Demo(int a, int b) {
value1 = a;
value2 = b;
System.out.println("Inside 3rd Constructor");
}
public void display() {
System.out.println("Value1 === " + value1);
System.out.println("Value2 === " + value2);
}
public static void main(String[] args) {
Demo d1 = new Demo();
Demo d2 = new Demo(30);
Demo d3 = new Demo(30, 40);
d1.display();
d2.display();
d3.display();
}
}
ステップ 2: コンパイルして実行。パラメータ付きコンストラクタを追加した後、デフォルトコンストラクタ Demo() がないためエラーになります。デフォルトコンストラクタを使うには明示的に宣言:
Demo() {
// デフォルト初期化やカスタムロジック
}
コメントアウトブロックをアンコメントして再コンパイルすると正しく実行されます。
コンストラクタチェーン
サブクラスがインスタンス化されると、まずスーパークラスのコンストラクタが実行されます。これが コンストラクタチェーン です。
例 3 – 親子間のチェーン
ステップ 1: 以下のコードをコピー。
class Demo {
int value1;
int value2;
Demo() {
value1 = 1;
value2 = 2;
System.out.println("Inside 1st Parent Constructor");
}
Demo(int a) {
value1 = a;
System.out.println("Inside 2nd Parent Constructor");
}
public void display() {
System.out.println("Value1 === " + value1);
System.out.println("Value2 === " + value2);
}
public static void main(String[] args) {
DemoChild d1 = new DemoChild();
d1.display();
}
}
class DemoChild extends Demo {
int value3;
int value4;
DemoChild() {
// super(5); // アンコメントでオーバーロードされた親コンストラクタを呼び出し
value3 = 3;
value4 = 4;
System.out.println("Inside the Constructor of Child");
}
public void display() {
System.out.println("Value1 === " + value1);
System.out.println("Value2 === " + value2);
System.out.println("Value3 === " + value3);
System.out.println("Value4 === " + value4);
}
}
ステップ 2: プログラム実行。子コンストラクタが明示的に super() を呼ばないため、デフォルトの Demo() コンストラクタが最初に実行されます。期待される出力:
Inside 1st Parent Constructor Inside the Constructor of Child Value1 === 1 Value2 === 2 Value3 === 3 Value4 === 4
ステップ 3: オーバーロードされた親コンストラクタ Demo(int a) を呼び出すには、子コンストラクタの最初の行に super(5); を配置。アンコメントして再実行:
Inside 2nd Parent Constructor Inside the Constructor of Child Value1 === 5 Value2 === 0 Value3 === 3 Value4 === 4
特定のスーパークラスコンストラクタをサブクラスロジック前に実行する必要があるとき、super(...) は必須です。
Java
- C#コンストラクタオーバーロード完全ガイド:柔軟なクラス設計
- Java Hello World:最初のプログラム
- Javaコンストラクタをマスター:種類、使い方、実践例
- Java Enumコンストラクタ徹底解説:実践例で理解する
- Java String.indexOf()マスター:部分文字列検索と実践例
- Java String.compareTo()マスター:構文、ユースケース、実践例
- Java static 完全解説:変数・メソッド・ブロックの実践例
- Javaで素数判定を行うプログラム
- Javaで1から100までの素数を列挙するプログラム
- JavaでcharをStringに変換する方法:実践例とベストプラクティス
- Javaでアームストロング数を判定・列挙するプログラム