私はプロジェクトに取り組んでいますが、「暗黙のスーパーコンストラクターPerson()は未定義です。別のコンストラクターを明示的に呼び出す必要があります」というエラーが表示され、理解できません。
これが私の個人クラスです:
public class Person {
public Person(String name, double DOB){
}
}
そして、個人クラスを実装しようとし、それにインストラクター変数を与えるときの私の学生クラス。
public class Student extends Person {
public Student(String Instructor) {
}
}
コンストラクターが明示的にスーパークラスコンストラクターを呼び出さない場合、Javaコンパイラーはスーパークラスの引数なしコンストラクターへの呼び出しを自動的に挿入します。
スーパークラスに引数なしのコンストラクタがない場合、コンパイル時エラーが発生します。 Objectにはそのようなコンストラクターがあるため、Objectが唯一のスーパークラスである場合、問題はありません。
参照: http://docs.Oracle.com/javase/tutorial/Java/IandI/super.html :(「サブクラスコンストラクター」セクションを参照)
したがって、パラメーター化されたコンストラクターを扱うときは常に、親コンストラクターに対してsuper(parameter1, parameter2 ..)
呼び出しを行います。 また、このsuper()呼び出しは、コンストラクタブロックの最初の行である必要があります。
定義済みのコンストラクターに対してsuper
呼び出しを行う必要があります。
_public Student(String instructor) {
super(/* name */, /* date of birth */);
}
_
コンストラクターが定義されていないため、単にsuper()
を呼び出すことはできません。
これは私がそれを達成した方法です(私の場合、スーパークラスはチームで、サブクラスはスコアラーでした):
// Team.Java
public class Team {
String team;
int won;
int drawn;
int lost;
int goalsFor;
int goalsAgainst;
Team(String team, int won, int drawn, int lost, int goalsFor, int goalsAgainst){
this.team = team;
this.won = won;
this.drawn = drawn;
this.lost = lost;
this.goalsFor = goalsFor;
this.goalsAgainst = goalsAgainst;
}
int matchesPlayed(){
return won + drawn + lost;
}
int goalDifference(){
return goalsFor - goalsAgainst;
}
int points(){
return (won * 3) + (drawn * 1);
}
}
// Scorer.Java
public class Scorer extends Team{
String player;
int goalsScored;
Scorer(String player, int goalsScored, String team, int won, int drawn, int lost, int goalsFor, int goalsAgainst){
super(team, won, drawn, lost, goalsFor, goalsAgainst);
this.player = player;
this.goalsScored = goalsScored;
}
float contribution(){
return (float)this.goalsScored / (float)this.goalsFor;
}
float goalsPerMatch(){
return (float)this.goalsScored/(float)(this.won + this.drawn + this.lost);
}
}
スーパークラスのコンストラクターを呼び出さずにインスタンスを作成することはできません。また、jvmは、Student(String)コンストラクターからPerson(String、double)を呼び出す方法を知りません。
サブクラスコンストラクターを作成するときに、super
でスーパークラスコンストラクターを明示的に呼び出さない場合、Javaは引数なしの「デフォルト」スーパークラスコンストラクターへの暗黙的な呼び出しを挿入します、つまりsuper();
。
ただし、スーパークラスPerson
には引数なしのコンストラクタはありません。 Person
で明示的な引数なしのコンストラクタを指定するか、Student
コンストラクタで既存のスーパークラスコンストラクタを明示的に呼び出します。