El proceso de ejecución de la memoria cuando se utilizan la palabra clave super y esta palabra clave

Como de costumbre, cargue el código primero:

clase pública Fu {
    int num = 10;
    método de vacío público () {
        System.out.println ("Método de miembro de clase principal");
    }
}
la clase pública Zi extiende Fu {
    int num = 20;

    @Anular
    public void method () {// El nombre del método es el mismo, la lista de parámetros es la misma, heredada, por lo que se sobrescribe y reescribe
        super.method ();
        System.out.println ("Método de miembro de subclase");

    }
    show vacío público () {
        int num = 30;
        System.out.println (num); // 30 variables locales
        System.out.println (this.num); // 20 variables miembro de esta clase
        System.out.println (super.num); // 10 variables de miembro de clase padre
    }
}
clase pública Demo05 {
    public static void main (String [] args) {
        Zi zi = nuevo Zi ();
        zi.show ();
        zi.method ();
    }
}

Ejecutar captura de pantalla:

Analice el proceso de ejecución de la memoria:

En primer lugar, ponga la información de tres .class en el área de método como de costumbre, pero tenga en cuenta que debido a la relación de herencia, hay una marca especial [[super_class]] generada automáticamente por el compilador en la información .class de la subclase. Esta marca especial es. Un puntero apunta a la clase principal y le dice al niño quién es la clase principal.

Luego, para ejecutar, luego el método principal en la información de Demo.class se enviará a la pila, y luego el contenido del método principal se ejecutará secuencialmente. Primero, se declara un objeto de subclase y el objeto de subclase asignado a la derecha side se asigna al nuevo objeto de subclase para abrir un espacio en el montón. Almacene la información de este objeto de subclase y asigne el valor de dirección de este objeto de subclase en el montón al nombre del objeto declarado en la pila.

Tenga en cuenta que se construye un objeto de estructura padre completo entre los objetos de subclase almacenados en el montón (por lo tanto, la clase padre debe construirse primero antes de que la subclase pueda heredarla). Es decir, el padre está adentro y el niño afuera.

Veamos primero lo que hay en la estructura de la clase principal, incluidas las variables miembro y los métodos miembros declarados en la clase principal ( tenga en cuenta que los métodos miembros en este montón almacenan solo sus valores de dirección en el área de métodos ).

En este momento, donde cada variable está en la memoria, tenemos un análisis claro, y el foco está en la palabra clave this y la palabra clave super. Esto se refiere al objeto que llama al método, por lo que debe referirse al objeto de la subclase, y super se refiere al objeto de la clase padre heredado por el objeto de la subclase (por lo que la palabra clave super no se puede usar en el método estático, la clase siempre precede a la Construcción del objeto completada)

El valor de la dirección del nuevo objeto de subclase se asigna al nombre de la variable local declarado en la pila, y luego se llama a un método de miembro de subclase show (), y el método se encuentra en el área de métodos de acuerdo con el nombre del objeto y la información de la clase. para ejecutarse en la pila ( tenga en cuenta que el método debe insertarse en la pila para ejecutarse ), respectivamente, la salida 30, 20, 10, primero 30 genera el valor de la variable local de acuerdo con el principio de proximidad, y 20 llama a la palabra clave this, luego señala el contenido de la subclase a la que se refiere y lee el 20. Realice la salida. Lo mismo es cierto para la palabra clave super, que apunta al contenido de la clase principal a la que se refiere, lee el 30 en él y lo genera.

Finalmente, ejecute el método método de la subclase, y primero busque el método con el mismo nombre de la subclase en el área de métodos y colóquelo en la pila, ¡pero preste atención en este momento! La primera oración de este método de la subclase es super.method (); ejecuta el método del mismo nombre que la clase principal, luego también se busca el objeto de la clase principal al que hace referencia la palabra clave super, y el método del mismo nombre de la clase padre se coloca en la pila.

Luego, ejecute desde el método de la clase principal en la parte superior de la pila, salga de la pila después de ejecutar y ejecute el siguiente.

Diagrama completo del proceso de evolución de la memoria:

Supongo que te gusta

Origin blog.csdn.net/wardo_l/article/details/113829596
Recomendado
Clasificación