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) {
}
}
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.
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.
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);
}
}
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).
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
.