mostrar - jlabel java
Por qué el constructor de súper clase siempre se llama (3)
Esta pregunta ya tiene una respuesta aquí:
Tengo las siguientes 2 clases
public class classA {
classA() {
System.out.println("A");
}
}
class classB extends classA {
classB() {
System.out.println("B");
}
}
y luego corriendo
1
classA c = new classB();
o
2
classB c = new classB();
siempre da
A
B
¿Por qué está pasando esto? A primera vista, en cualquier caso, supondría que solo se classB
constructor classB
y, por lo tanto, la única salida sería
B
pero esto está claramente mal.
Así es como funciona Java. Se llama a los constructores de las clases principales, hasta la jerarquía de clases a través de Object
, antes de que se llame al constructor de la clase secundaria.
Citando de los documentos :
Con
super()
, se llama al constructor de superclase sin argumentos. Consuper(parameter list)
, se llama al constructor de superclase con una lista de parámetros coincidentes.Nota: Si un constructor no invoca explícitamente un constructor de superclase, el compilador de Java inserta automáticamente una llamada al constructor sin argumentos de la superclase . Si la súper clase no tiene un constructor sin argumentos, obtendrá un error en tiempo de compilación.
Object
tiene tal constructor, por lo que siObject
es la única superclase, no hay problema.Si un constructor de subclase invoca a un constructor de su superclase, ya sea explícita o implícitamente, podría pensar que habrá una cadena completa de constructores llamados, hasta el constructor de
Object
. De hecho, este es el caso. Se denomina encadenamiento de constructores , y debe tenerlo en cuenta cuando hay una línea larga de descendencia de clase.
El constructor de súper clase siempre se llama durante el proceso de construcción y se garantiza que la construcción de súper clase se finalice antes de que se llame al constructor de subclase. Este es el caso de la mayoría si no todo el lenguaje orientado a objetos. Podría llamar explícitamente al constructor de superclase con un parámetro si no desea invocar al constructor predeterminado; De lo contrario, dicha llamada es automatizada por el compilador.
No hay diferencia en ambas afirmaciones en términos de objetos que se están construyendo, por lo que se ve lo mismo.
El solo hecho de usar un tipo de referencia diferente en el lado izquierdo mientras se construyen los mismos objetos utilizando new
no va a hacer ninguna diferencia en lo que respecta a la creación de objetos y el encadenamiento de constructores.
Cualquiera que sea la diferencia entre dos de sus declaraciones es después de que se crean los objetos.