simple - que es un constructor en java
Java: el constructor de clases heredado llama a la clase Super (4)
Mientras creaba un programa Java encontré un problema,
Un constructor de subclase está lanzando un error llamando al método de la Superclase
El código es similar a esto:
class Manage
{
public static void main(String[] args)
{
Manager m1 = new Manager ( 35 );
}
}
class Employee
{
int emp_id;
public Employee(int id)
{
this.emp_id = id;
}
public int get_id()
{
return emp_id;
}
}
class Manager extends Employee
{
public Manager(int id )
{
this.emp_id = id ;
}
}
class Engineer extends Employee
{
public Engineer(int id)
{
this.emp_id = id ;
}
}
Y el error es algo como esto:
$ javac app.java
app.java:25: cannot find symbol
symbol : constructor Employee()
location: class Employee
{
^
app.java:33: cannot find symbol
symbol : constructor Employee()
location: class Employee
{
^
2 errors
Por qué pasó esto ?
Como ha especificado un constructor con argumentos, Java no proporciona un constructor predeterminado sin argumentos. Debe crear uno usted mismo o llamar explícitamente al constructor que ha creado, utilizando super(id)
como primera línea en los constructores de clases extendidas.
El error se genera porque no definiste un constructor predeterminado (sin argumentos) en Employee
class Employee {
private int emp_id;
public Employee() {
}
public Employee(int id) {
this.emp_id = id;
}
public int get_id() {
return emp_id;
}
}
pero hay un par de puntos a considerar: está configurando emp_id
través del constructor y ha definido un getter para leerlo. Parece que el campo estaba destinado a ser privado. De lo contrario, solo puede acceder directamente.
Ya tiene un constructor en Employee que configura el ID. No necesita definir el mismo constructor en la misma clase. Solo usa el constructor de la superclase.
class Manager extends Employee {
public Manager(int id ) {
super(id); // calls the superclass constructor
}
}
En este caso, no necesita el constructor predeterminado.
En java, un constructor de subclase siempre llama a uno de los constructores de su clase padre. Esto es necesario para que la clase se inicialice correctamente. Incluso cuando está subclasificado, los campos y el estado deben configurarse y así es como se hace en Java. Si no se especifica explícitamente, está llamando al constructor no-arg predeterminado.
La superclase no tiene un constructor predeterminado. Por lo tanto, debe pasar los argumentos apropiados del constructor a la superclase:
super(id);
(Pon esto como la línea superior tanto en el constructor Manager
como en el Engineer
). También debes eliminar la línea this.emp_id = id
, en ambos casos.
En general, si su constructor no comienza con una instrucción super(...)
o this(...)
(y solo puede tener una de estas, no ambas), se usa de forma predeterminada super()
(con sin argumentos).