llamadas abstractas clase padre método clase derivada

Omer Segal:

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?

rgettman:

El constructor de la superclase se llama en primer lugar. Se llama count()dos veces. Con polimorfismo, count()en la deriveque se llama, incrementando counta 2. Lo que se incrementa es la countvariable derive, ya que lo que los nombres de simples countmedios en la subclase. La countvariable en testque se oculta por el counten 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 countya está 2, se "inicializa" de 0todos modos. Así que incluso si se agrega una declaración de impresión en el constructor de la subclase, usted todavía consigue 0por countallí también.

Para obtener una countde 2, quitar el counten derivey cambiar el countde testser protectedo paquete-privada (sin modificador de acceso). Esto hará count()incrementar la variable counten test.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=199153&siteId=1
Recomendado
Clasificación