Esta publicación resume una pregunta común sobre los constructores de Java.
1. ¿Por qué la creación de un objeto de la subclase invoca también al constructor de la superclase?
class Super {
String s;
public Super(){
System.out.println("Super");
}
}
public class Sub extends Super {
public Sub(){
System.out.println("Sub");
}
public static void main(String[] args){
Sub s = new Sub();
}
}
|
clase Super {String s; public Super () {System.out.println («Super»); }} clase pública Sub extiende Super {público Sub () {System.out.println («Sub»); } public static void main (String[] args) {Sub s = new Sub (); }}
Imprime:
Super
Sub
Cuando se hereda de otra clase, primero se debe llamar a super () en el constructor. De lo contrario, el compilador insertará esa llamada. Esta es la razón por la que el superconstructor también se invoca cuando se crea un objeto Sub.
Esto no crea dos objetos, solo un objeto Sub. La razón para llamar al superconstructor es que si la superclase podría tener campos privados que deben ser inicializados por su constructor.
Después de que el compilador inserta el superconstructor, el constructor de la subclase tiene el siguiente aspecto:
public Sub(){
super();
System.out.println("Sub");
}
|
public Sub () {super (); System.out.println («Sub»); }
2. Un mensaje de error común: el superconstructor implícito no está definido para el constructor predeterminado
Este es un mensaje de error de compilación visto por muchos desarrolladores de Java:
«El superconstructor implícito no está definido para el constructor predeterminado. Debe definir un constructor explícito»
Este error de compilación se produce porque el superconstructor predeterminado no está definido. En Java, si una clase no define un constructor, el compilador insertará un constructor sin argumentos predeterminado para la clase por defecto. Si un constructor está definido en la clase Super, en este caso Super (String s), el compilador no insertará el constructor sin argumentos predeterminado. Esta es la situación de la clase Super anterior.
Los constructores de la clase Sub, ya sea con argumento o sin argumento, llamarán al superconstructor sin argumento. Dado que el compilador intenta insertar super () en los 2 constructores de la clase Sub, pero el constructor predeterminado de Super no está definido, el compilador informa el mensaje de error.
Para solucionar este problema, simplemente 1) agregue un constructor Super () a la clase Super como
public Super(){
System.out.println("Super");
}
|
public Super () {System.out.println («Super»); }
, o 2) eliminar el superconstructor autodefinido, o 3) agregar super(value)
a los subconstructores.
3. Llamar explícitamente al superconstructor en el subconstructor
El siguiente código está bien:
El subconstructor llama explícitamente al superconstructor con parámetro. El superconstructor está definido y es bueno invocarlo.
4. La regla
En resumen, las reglas son: el constructor de la subclase tiene que invocar al instructor de la superclase, ya sea explícitamente por el programador o implícitamente por el compilador. De cualquier manera, se debe definir el superconstructor invocado.
5. La pregunta interesante
¿Por qué Java no proporciona un constructor predeterminado, si la clase tiene un constructor con parámetro (s)?
Algunas respuestas: http://stackoverflow.com/q/16046200/127859