web-dev-qa-db-ja.com

暗黙的なスーパーコンストラクターPerson()は未定義です。別のコンストラクターを明示的に呼び出す必要がありますか?

私はプロジェクトに取り組んでいますが、「暗黙のスーパーコンストラクターPerson()は未定義です。別のコンストラクターを明示的に呼び出す必要があります」というエラーが表示され、理解できません。

これが私の個人クラスです:

public class Person {
    public Person(String name, double DOB){

    }
}

そして、個人クラスを実装しようとし、それにインストラクター変数を与えるときの私の学生クラス。

public class Student extends Person {

    public Student(String Instructor) {

    }

}
19
sirnomnomz

コンストラクターが明示的にスーパークラスコンストラクターを呼び出さない場合、Javaコンパイラーはスーパークラスの引数なしコンストラクターへの呼び出しを自動的に挿入します。

スーパークラスに引数なしのコンストラクタがない場合、コンパイル時エラーが発生します。 Objectにはそのようなコンストラクターがあるため、Objectが唯一のスーパークラスである場合、問題はありません。

参照: http://docs.Oracle.com/javase/tutorial/Java/IandI/super.html :(「サブクラスコンストラクター」セクションを参照)

したがって、パラメーター化されたコンストラクターを扱うときは常に、親コンストラクターに対してsuper(parameter1, parameter2 ..)呼び出しを行います。 また、このsuper()呼び出しは、コンストラクタブロックの最初の行である必要があります。

32
pxm

定義済みのコンストラクターに対してsuper呼び出しを行う必要があります。

_public Student(String instructor) {
    super(/* name */, /* date of birth */);
}
_

コンストラクターが定義されていないため、単にsuper()を呼び出すことはできません。

6
Rogue

これは私がそれを達成した方法です(私の場合、スーパークラスはチームで、サブクラスはスコアラーでした):

// 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);
    }
}
1
Jaime Montoya

スーパークラスのコンストラクターを呼び出さずにインスタンスを作成することはできません。また、jvmは、Student(String)コンストラクターからPerson(String、double)を呼び出す方法を知りません。

サブクラスコンストラクターを作成するときに、superでスーパークラスコンストラクターを明示的に呼び出さない場合、Javaは引数なしの「デフォルト」スーパークラスコンストラクターへの暗黙的な呼び出しを挿入します、つまりsuper();

ただし、スーパークラスPersonには引数なしのコンストラクタはありません。 Personで明示的な引数なしのコンストラクタを指定するか、Studentコンストラクタで既存のスーパークラスコンストラクタを明示的に呼び出します。

0
rgettman