癒しと元気、いきいき生活をするための知識を発信していきます

フリーライフ~自由人。心を楽しく、体を若く~

プログラミング

【Java入門】デフォルトコンストラクタの落とし穴:なぜコンパイルエラーになるのか?

投稿日:

Java学習者が最初につまずきやすいポイントのひとつに「コンストラクタとデフォルトコンストラクタの関係」があります。
今回は実際のコード例を交えながら、この仕組みを整理してみましょう。

デフォルトコンストラクタとは?

Javaでは、コンストラクタを1つも定義しなかった場合のみ、コンパイラが自動的に「引数なしコンストラクタ」を生成してくれます。これを「デフォルトコンストラクタ」と呼びます。

ところが、1つでも自分でコンストラクタを定義すると、デフォルトコンストラクタは自動的には作られません。
ここで混乱が起こりやすいのです。

例:コンパイルエラーになるケース

次のコードを見てください。

class Monster {
// 引数付きコンストラクタを定義
Monster(String type) {
System.out.println("Monster type: " + type);
}
}

public class Main {
public static void main(String[] args) {
// 引数なしで生成しようとする
Monster m = new Monster(); // ★ エラー
}
}

実際のエラー内容

上のコードをコンパイルすると、エラーになります。

つまり、コンパイラは「Monster()という引数なしコンストラクタは存在しない」と教えてくれています。

なぜこうなるのか?

Monster(String type) という 引数ありのコンストラクタを定義したため、

コンパイラは デフォルトコンストラクタ(引数なし)を自動生成しない。

その状態で new Monster() を書くと、存在しないメソッドを呼び出そうとするのでコンパイルエラーになる。

正しい解決方法

もし引数なしの生成方法も用意したいなら、明示的に自分でコンストラクタを追加する必要があります。

class Monster {
// 引数付き
Monster(String type) {
System.out.println("Monster type: " + type);
}

// 明示的に引数なしコンストラクタを定義
Monster() {
System.out.println("Default monster created");
}
}

public class Main {
public static void main(String[] args) {
Monster m1 = new Monster("Dragon"); // Monster type: Dragon
Monster m2 = new Monster(); // Default monster created
}
}

まとめ

デフォルトコンストラクタは「コンストラクタを1つも定義していないときだけ」自動生成される。

1つでも自分でコンストラクタを定義したら、デフォルトは作られない。

引数なしで生成したいなら、自分で書かなければならない。

この仕組みを理解していないと、Java学習の序盤で「なぜコンパイルエラーになるの?」と混乱しやすいポイントです。
覚えておけば、Bronzeレベルの試験でも現場でも安心して対応できます。

-プログラミング

Copyright© フリーライフ~自由人。心を楽しく、体を若く~ , 2025 All Rights Reserved Powered by AFFINGER5.