En el siguiente ejemplo:Llamar a un método reemplazado de un constructor
class Base {
int x=10;
Base() {
show();
}
void show() {
System.out.print ("Base Show " +x + " ");
}
}
class Child extends Base {
int x=20;
Child() {
show();
}
void show() {
System.out.print("Child Show " + x +" ") ;
}
public static void main(String s[ ]) {
Base obj = new Child();
}
}
- ¿Por qué es la salida como se muestra a continuación
Child Show 0 Child Show 20
- pensé Los constructores pueden solo acceder a los miembros de la instancia una vez que sea su súper constructor s completado
Creo que lo que está sucediendo aquí es que el super constructor llama al método show() del niño porque este método fue anulado en Child. ya que ha sido anulado pero ¿por qué es el valor de x 0 y por qué es capaz de acceder a este método antes de que el super constructor se haya completado?
¿Está activado el mecanismo de manipulación virtual durante la construcción de un objeto? Dudo que no lo sea. – Mahesh
En C++ esto puede causar un bloqueo. –
Effective Java es un gran recurso de Java y entra en esto con gran detalle. Del Elemento 17: "*** Los constructores no deben invocar métodos invalidables **, directa o indirectamente (...) Si el método de anulación depende de cualquier inicialización realizada por el constructor de la subclase, el método no se comportará como se espera. * "Si tienes el libro a la mano, recomiendo leer este artículo. –