J'ai actuellement une classe, Appelons-personne, avec un constructeur comme ainsi.
public class Person
{
private String name;
public Person(String name)
{
this.name = name;
System.out.println("This person is: "+getName());
}
public String getName()
{
return this.name;
}
public void setName(String name)
{
this.name = name;
}
}
Ensuite, nous héritons la classe avec un type plus spécifique de la personne, dans ce cas, un employé.
public class Employee extends Person
{
private int id;
public Employee(String name, int id)
{
super(name);
this.id = id;
System.out.println("This person is: "+getName()+", identified by #"+getId());
}
public int getId()
{
return this.name;
}
public void setId(int id)
{
this.id = id;
}
}
Je suis désireux de le faire de telle sorte que l'employé imprime propre déclaration de quand l'objet est créé, mais il est en train d'imprimer à la fois la déclaration d'impression de personne et aussi des employés. Comment puis-je remplacer cette déclaration à empêcher que cela se passe? Y at-il une meilleure façon d'imprimer sur la console qui empêchera que cela se produise?
Comment puis-je remplacer cette déclaration à empêcher que cela se passe?
Vous ne pouvez pas, à moins que vous pouvez modifier Person
pour fournir un constructeur qui ne fait pas l' System.out.println
appel. Une sous - classe doit appeler l' un de ses superclasse constructors.¹ Votre Person
classe n'a que celui, qui comprend l' System.out.println
appel, donc Employee
n'a pas d'autre choix que de l' appeler.
Ceci est l' une des raisons constructeurs ne devraient pas avoir des effets secondaires. Ni Person
ne Employee
devrait appeler System.out.println
. Cela devrait être laissé à coder avec la classe, ou une méthode (plutôt que constructeur).
¹ Si vous ne le faites pas explicitement, le compilateur insère super()
au début de votre constructeur. Dans votre cas, ce serait une erreur de compilation, car Person
ne dispose pas d' un constructeur sans paramètres.