Así que me preguntaba acerca de cómo se construyen las instancias clases.
public abstract class test {
int count;
public test(){
count();
count();
System.out.println("test" + this.count);
}
abstract void count();
}
public class derive extends test{
int count;
public derive(){
System.out.println("derive");
}
@Override
public void count(){
count++;
}
}
public static void main(String[] args) {
derived o = new derived();
}
La salida es:
test0
derivar
¿Cómo es que count = 0? y no 2?
El constructor de la superclase se llama en primer lugar. Se llama count()
dos veces. Con polimorfismo, count()
en la derive
que se llama, incrementando count
a 2
. Lo que se incrementa es la count
variable derive
, ya que lo que los nombres de simples count
medios en la subclase. La count
variable en test
que se oculta por el count
en derive
.
Sin embargo, la declaración de impresión se refiere al count
ámbito de la superclase, que todavía está 0
.
Tenga en cuenta que cuando finalice la superclase constructor, entonces el cuerpo constructor de la subclase pueden finalmente ejecutar. Esto incluye todas las variables de instancia dando valores iniciales. Aquí, a pesar de que count
ya está 2
, se "inicializa" de 0
todos modos. Así que incluso si se agrega una declaración de impresión en el constructor de la subclase, usted todavía consigue 0
por count
allí también.
Para obtener una count
de 2
, quitar el count
en derive
y cambiar el count
de test
ser protected
o paquete-privada (sin modificador de acceso). Esto hará count()
incrementar la variable count
en test
.