web-dev-qa-db-fra.com

super constructeur implicite Personne () n'est pas défini. Doit-il appeler explicitement un autre constructeur?

Je travaille sur un projet et j'obtiens l'erreur "Le super constructeur implicite Personne () n'est pas défini. Doit invoquer explicitement un autre constructeur" et je ne le comprends pas très bien.

Voici mon cours de personne:

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

    }
}

Et ma classe d'étudiants lorsque je tente d'implémenter la classe de personnes et de lui attribuer une variable instructeur.

public class Student extends Person {

    public Student(String Instructor) {

    }

}
12
sirnomnomz

Si un constructeur n'appelle pas explicitement un constructeur de superclasse, le compilateur Java insère automatiquement un appel au no-argument constructeur de la superclasse. 

Si la super classe n'a pas de constructeur sans argument, vous obtiendrez une erreur lors de la compilation. Objet a un tel constructeur, donc si Object est la seule superclasse, Il n'y a pas de problème.

Référence: http://docs.Oracle.com/javase/tutorial/Java/IandI/super.html : (Voir sous la section 'Constructeurs de sous-classes')

Ainsi, chaque fois que vous avez affaire à des constructeurs paramétrés, appelez super(parameter1, parameter2 ..) au constructeur parent .Cet appel super () devrait également être la ligne FIRST de votre bloc constructeur. 

23
pxm

Vous devez faire un appel super au constructeur défini:

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

Vous ne pouvez pas simplement appeler super() car ce constructeur n'est pas défini.

5
Rogue

Voici comment je l'ai réalisé (dans mon cas, la super-classe était Team et la sous-classe était 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

vous ne pouvez pas créer une instance sans appeler un constructeur de sa super classe. Et jvm ne sait pas comment appeler Person (String, double) à partir de votre constructeur Student (String).

0

Lors de la création d'un constructeur de sous-classe, si vous n'appelez pas explicitement un constructeur de superclasse avec super, alors Java insérera un appel implicite au constructeur de superclasse no-arg "par défaut", à savoir super();.

Cependant, votre super-classe Person ne possède pas de constructeur no-arg. Fournissez un constructeur explicite sans argument dans Person ou appelez explicitement le constructeur de superclasse existant dans le constructeur Student.

0
rgettman