Java暗黙のスーパーコンストラクターは未定義のエラーです
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でから入手できます。