it-swarm.com.de

der implizite Superkonstruktor Person () ist undefiniert. Muss explizit einen anderen Konstruktor aufrufen?

Ich arbeite an einem Projekt und erhalte den Fehler "Der implizite Superkonstruktor Person () ist undefiniert. Er muss explizit einen anderen Konstruktor aufrufen", und ich kann ihn nicht ganz verstehen.

Hier ist meine Personenklasse:

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

    }
}

Und meine Studentenklasse beim Versuch, die Personenklasse zu implementieren und ihr eine Instruktorvariable zu geben.

public class Student extends Person {

    public Student(String Instructor) {

    }

}
12
sirnomnomz

Wenn ein Konstruktor einen Superklassenkonstruktor nicht explizit aufruft, Der Java-Compiler fügt automatisch einen Aufruf für das Argument no ein Konstruktor der Superklasse. 

Wenn die Superklasse kein .__ hat. Wenn Sie keinen Argumentkonstruktor verwenden, wird ein Fehler bei der Kompilierung angezeigt. Objekt hat einen solchen Konstruktor, wenn also Object die einzige Superklasse ist, Es gibt kein Problem.

Referenz: http://docs.Oracle.com/javase/tutorial/Java/IandI/super.html : (Siehe unter "SubClass Constructors")

Wenn Sie sich mit parametrisierten Konstruktoren befassen, machen Sie also einen Aufruf von super(parameter1, parameter2 ..) an den übergeordneten Konstruktor .Auch dieser super () - Aufruf sollte die FIRST-Zeile in Ihrem Konstruktorblock sein. 

23
pxm

Sie müssen einen Aufruf von super an Ihren definierten Konstruktor ausführen:

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

Sie können nicht einfach super() aufrufen, da dieser Konstruktor nicht definiert ist.

5
Rogue

So habe ich es erreicht (in meinem Fall war die Superklasse Team und die Unterklasse Scorer):

// 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

sie können keine Instanz erstellen, ohne einen Konstruktor der übergeordneten Klasse aufzurufen. Und der jvm weiß nicht, wie er Person (String, double) von Ihrem Student (String) -Konstruktor aus aufrufen kann.

Wenn Sie beim Erstellen eines Unterklassenkonstruktors nicht explizit einen Superklassenkonstruktor mit super aufrufen, fügt Java einen impliziten Aufruf des Superklasskonstruktors no-arg "default" ein, d. H. super();.

Ihre Superklasse Person hat jedoch keinen Konstruktor ohne Argumente. Geben Sie entweder einen expliziten No-Arg-Konstruktor in Person an oder rufen Sie explizit den vorhandenen Superklassen-Konstruktor im Student-Konstruktor auf.

0
rgettman