Cuando Java crea objetos, bloques de código estático, bloques de código dinámico, constructores, orden de inicialización y cambios en el área de método, montón y pila

Reyco Guo-Spring4-010-SpringIoc primer programa-revisión de creación de objetos

package com;

public class Test {
    public int k = 999;
    static {
        System.out.println("执行静态块");
        //System.out.println("k = "+k);    //  编译错误
    }

    {
        System.out.println("执行动态块");
        System.out.println("k = "+k);      //  输入99
    }

    public Test() {
        System.out.println("执行构建方法");
        System.out.println("k = "+k);     //  输入99
    }

    public static void main(String args[]) {
        Test t = new Test();
    }
}
  1. La secuencia de ejecución derivada de los resultados de ejecución anteriores:
    1. bloque estático
    2. bloque de código dinámico
    3. constructor sin argumentos
  2. Pregunta 1: ¿Qué es crear un objeto (instancia de una clase java)? jvm asigna espacio de memoria para nuevos objetos e inicializa objetos en el montón, ¿cuál viene primero?
    1. Respuesta: La creación de un objeto (una instancia de una clase Java) se divide en 2 pasos:
      1. Paso 1: Es para asignarle espacio de memoria en la memoria del montón.
      2. Paso 2: inicializa el objeto.
  3. Pregunta 2: jvm asigna espacio de memoria para nuevos objetos en la memoria del montón ¿Para qué se asigna exactamente el espacio de memoria?
    1. Respuesta: Asignar espacio de memoria a un objeto en el montón es en realidad asignar espacio de memoria en el montón a las variables miembro del objeto. Por ejemplo, cuando la clase Test.java anterior crea un objeto, el espacio de memoria asignado en la memoria del montón es el espacio (12 bytes) asignado a la variable miembro int k = 99.
  4. Pregunta 3: ¿Qué es la inicialización del objeto completada?
    1. Respuesta: Si se han inicializado todas las variables miembro del nuevo objeto, significa que se ha inicializado todo el objeto.
  5. Pregunta 4: antes de comenzar a ejecutar el constructor sin argumentos, ¿la JVM ha asignado el espacio de memoria de almacenamiento dinámico en el almacenamiento dinámico para este nuevo objeto? Antes de comenzar a ejecutar el constructor sin argumentos, ¿se completó la inicialización del nuevo objeto? Cuando se ejecuta el constructor sin argumentos, ¿se crea el objeto? Cuando se ejecuta el constructor sin argumentos, ¿el objeto ya se ha creado? ¿O el objeto se crea durante la ejecución del constructor sin argumentos? ¿O se crea el objeto después de ejecutar el método del constructor sin argumentos?
    1. Respuesta: antes de ejecutar el constructor, jvm ha asignado espacio de memoria de almacenamiento dinámico para este nuevo objeto en la memoria de almacenamiento dinámico, y jvm también ha inicializado el nuevo objeto.
    2. Prueba: debido a que el orden de ejecución de la creación de objetos es bloque de código estático > bloque de código dinámico > constructor sin argumentos, y se emite "k = 99" cuando se ejecuta el bloque de código dinámico, significa que el objeto se ha creado antes de ejecutar el El constructor sin argumentos (asigne espacio de memoria para él en la memoria del montón e inicialice el objeto) está completo.
  6. Pregunta 5: cuando una clase vacía (sin ninguna variable miembro, como Object obj = new Object()) crea un objeto, ¿sabe cuántos bytes jvm asignará a este nuevo objeto en la memoria del montón? ¿Cuántos bytes ocupa un objeto sin variables miembro en la memoria del montón?
    1. Respuesta: 8 bytes. Porque todas las clases se heredan de la clase Object.java y los objetos de la clase Object.java ocupan 8 bytes. Pero tenga en cuenta que no hay variables miembro en la clase Object.java.
  7. Pregunta 6: ¿Cuántos bytes ocupa un objeto con variables miembro en la memoria del montón?
    1. Respuesta: 8 + el número de bytes que ocupa este objeto en la memoria del montón.
  8. Pregunta 7: Para la clase Test.java anterior, ¿cuántos bytes de espacio de memoria en montón asigna jvm al objeto en la memoria en montón cuando se crea el objeto?
    1. Respuesta: 12 bytes. Debido a que el nuevo Object() heredado ocupa 8 bytes, y al mismo Test.java se le asignarán 4 bytes de espacio de memoria en montón porque int k = 99, por lo que suma un total de 12 bytes.
  9. Pregunta 9: ¿Qué contiene la variable de referencia?
    1. Respuesta: Una variable de referencia contiene una dirección que apunta a un objeto.
  10. Pregunta 9: ¿Cuántos bytes ocupa una variable miembro de referencia?
    1. Respuesta: No necesariamente, no estoy seguro. Debido a que la cantidad de bytes ocupados está relacionada con la cantidad de bits de la máquina que usa y el espacio virtual, por lo que ningún dato puede decirle (dirá) exactamente cuántos bytes ocupa una variable de referencia. Generalmente, es de 4 bytes u 8 bytes. Es incierto. Esto tiene algo que ver con la máquina y el espacio de direccionamiento de su máquina (porque la variable de referencia contiene una dirección, por lo que tiene algo que ver con la relación del espacio de direccionamiento) .
  11. Pregunta 10: ¿Cuáles son las cosas en el montón, el área de métodos y la pila? Stack_heap_method area_stack frame_memory proceso de cambio de ejecución del programa-Conocimiento

    1. montón
      1. Variables miembro
    2. área de método
      1. variable estática
    3. marco de pila de método
      1. variables locales en métodos
  12. Preguntas de prueba escritas de Alibaba: el orden de ejecución de bloques de código estático de Java, funciones estáticas, bloques de código dinámico, constructores, etc.

Supongo que te gusta

Origin blog.csdn.net/aiwokache/article/details/129074405
Recomendado
Clasificación