1. 概要

このチュートリアルでは、Java「暗黙のスーパーコンストラクターが未定義です」エラーを詳しく見ていきます。 まず、作成方法の例を作成します。 次に、例外の主な原因について説明し、後でそれを修正する方法を説明します。

2. 実例

ここで、コンパイルエラー「暗黙のスーパーコンストラクターX()が未定義です。 別のコンストラクターを明示的に呼び出す必要があります。」

ここで、 X は、このエラーが発生したサブクラスによって拡張された親クラスを表します。

まず、親クラスPersonを作成しましょう。

public class Person {

    String name;
    Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

   // setters and getters
}

次に、親がPersonであるサブクラスEmployeeを作成しましょう。

public class Employee extends Person {

    Double salary;

    public Employee(String name, Integer age, Double salary) {
        this.salary = salary;
    }

    // setters and getters
}

これで、IDEにエラーが表示されます。

Implicit super constructor Person() is undefined. Must explicitly invoke another constructor

子クラスにコンストラクターがない場合、同様のエラーが発生する場合があります。

たとえば、コンストラクターのないEmployeeについて考えてみましょう。

public class Employee extends Person {

    Double salary;

    // setters and getters
}

IDEにエラーが表示されます。

Implicit super constructor Person() is undefined for default constructor. Must define an explicit constructor

3. 原因

Java継承では、コンストラクターチェーンは、 super メソッドを使用してコンストラクターのシーケンスを呼び出し、親クラスからコンストラクターをチェーンすることを指します。 サブクラスコンストラクターは、明示的または暗黙的にスーパークラスコンストラクターを呼び出す必要があります。 いずれにせよ、スーパーコンストラクターを定義する必要があります。

親を持たないクラスは、その親としてObjectクラスを持ちます。 JavaのObjectクラスには、引数のないコンストラクターがあります。

クラスにコンストラクターがない場合、コンパイラーは引数をとらないデフォルトのコンストラクターを追加し、最初のステートメントで、コンパイラーはObjectのコンストラクターを呼び出すsuperへの呼び出しを挿入します。 クラス。

Person クラスにはコンストラクターが含まれておらず、親も含まれていないと仮定します。 コンパイルすると、コンパイラーがデフォルトのコンストラクターを追加したことがわかります。

public Person() {
    super();
}

対照的に、 Personクラスにコンストラクターが既に存在する場合、このデフォルトの引数なしコンストラクターはコンパイラーによって追加されません。

ここで、 Person、を拡張するサブクラス Employee を作成すると、Employeeクラスでエラーが発生します。

Implicit super constructor Person() is undefined for default constructor. Must define an explicit constructor

コンパイラーはsuper呼び出しをEmployeeコンストラクターに挿入するため、親クラスPerson。にパラメーターのないコンストラクターは見つかりません。

4. 解決

このエラーを解決するには、コンパイラに明示的に情報を提供する必要があります。

最初に行う必要があるのは、Employeeコンストラクターからsuperコンストラクターを明示的に呼び出すことです。

public Employee(String name, Integer age, Double salary) {
    super(name, age);
    this.salary = salary;
}

ここで、salaryフィールドのみを使用してEmployeeオブジェクトを作成する必要があるとします。 コンストラクターを書いてみましょう:

public Employee(Double salary) {
    super();
    this.salary = salary;
}

super呼び出しをEmployeeコンストラクターに追加しても、Personクラスに一致するコンストラクターがないため、エラーが発生します。 これを修正するには、Personクラスで引数のないコンストラクターを明示的に作成します。

public Person(String name, Integer age) {
    this.name = name;
    this.age = age;
}

public Person() {
}

最後に、これらの変更のおかげで、コンパイルエラーは発生しません。

5. 結論

Javaの「暗黙のスーパーコンストラクターは未定義です」というエラーについて説明しました。 次に、エラーの生成方法と例外の原因について説明しました。 最後に、エラーを解決するための解決策について説明しました。

いつものように、この記事のサンプルコードは、GitHubから入手できます。