Entrenamiento en Java de Beida Jade Bird: ¿Dos formas de crear nuevos objetos?
Hoy aprenderemos cómo crear nuevos objetos en el lenguaje de programación Java desde dos aspectos.
Cuando Java está en un objeto nuevo, primero verificará si la clase a la que pertenece el objeto se ha cargado en la memoria. De lo contrario, primero lo cargará a través del nombre completo de la clase.
Una vez completada la carga e inicialización de la clase, se creará el objeto.
Supongamos que la clase se usa una vez, por lo que un objeto se puede dividir en dos procesos: cargar e inicializar la clase y crear el objeto.
1. Proceso de carga de clases (use esta clase una vez) Java usa el modelo de delegación principal para cargar clases, así que antes de describir el proceso de carga de clases, primero echemos un vistazo a su proceso de trabajo: El proceso de trabajo del modelo de delegación principal Sí: si un cargador de clases recibe una solicitud de carga de clases, no intentará cargar la clase en sí, sino que delegará la solicitud al cargador de clases principal para que la complete. Esto es cierto para cada nivel del cargador de clases, por lo que todas las solicitudes de carga deberían eventualmente enviarse al cargador de clases de inicio de nivel superior. Solo cuando el cargador de clases principal informa que no puede completar la solicitud de carga (la clase que debe cargarse no se encuentra dentro de su alcance de búsqueda), el cargador de clases secundario intentará cargarla por sí mismo.
La ventaja de utilizar el mecanismo de delegación principal es que puede garantizar eficazmente la naturaleza global de una clase. Cuando hay varias clases con el mismo nombre calificado en el programa, el cargador de clases siempre carga solo una de ellas al cargar.
1. El cargador de clases es responsable de leer los bytes binarios de la clase de acuerdo con el nombre completo de la clase, almacenarlos en el área de métodos del área de memoria de tiempo de ejecución y luego convertirlos. en el objeto java.lang.Class correspondiente al tipo de destino. 2. Verificación del formato de verificación: verifique si se ajusta a la especificación del archivo de clase. Verificación semántica: verifique si el tipo marcado como final contiene una subclase; verifique si la subclase anula el método final de la clase; elementos entre la clase principal y la subclase Declaración de método (por ejemplo, la firma del método es la misma, pero el valor de retorno del método es diferente) verificación de operación: los datos en la pila de operandos deben operarse correctamente y varias referencias de símbolos. en el grupo constante debe verificarse (generalmente en la fase de análisis, a través de referencias de símbolos como se describe en El nombre completo verifica si se puede ubicar el tipo especificado, si el modificador de acceso de la información del miembro de la clase permite el acceso, etc.) 3. Prepárese para asignar espacio de memoria para todas las variables estáticas en la clase y establezca un valor inicial para ellas (debido a que el objeto aún no se ha generado, las variables de instancia no están dentro del alcance de esta operación), las variables estáticas (constantes) modificadas por final lo harán asignarse directamente; 4. Resolver las referencias de símbolos en el grupo constante en referencias directas (obtener los punteros de clases o campos y métodos en la memoria o compensar para llamar al método directamente), que se pueden ejecutar después de la inicialización.
Resolver contenido que requiera enlace estático.
//Todos los métodos y campos que no se anularán se vincularán estáticamente. Las tres etapas anteriores también se denominan etapas de enlace. Lo que debe hacer la fase de vinculación es fusionar la información de datos de clase del flujo de bytes binarios cargado en la JVM en el estado de tiempo de ejecución de la JVM.
5. Inicialización (padre antes que hijo) 4.1 Asignar valores a variables estáticas 4.2 Ejecutar bloques de código estático Nota: Los bloques de código estático solo pueden ser llamados por jvm. Si una clase necesita ser inicializada por varios subprocesos al mismo tiempo, solo se permite que un subproceso la inicialice y los demás subprocesos deben esperar. Solo después de que el hilo activo haya terminado de inicializar la clase, se notificará a otros hilos en espera.
Debido a que la subclase depende de la clase principal, el orden de carga de las clases es cargar primero la clase principal, luego la subclase, y lo mismo ocurre con la inicialización.
Sin embargo, cuando se inicializa la clase principal, el valor de la variable estática de la subclase también es el valor predeterminado.
Finalmente, el área de método almacenará la información de clase de la clase actual, incluidas las variables estáticas de clase, el código de inicialización de clase (declaraciones de asignación y bloques de código de inicialización estática al definir variables estáticas), definiciones de variables de instancia e inicialización de instancia. code (La declaración de asignación (bloque de código de instancia y método constructor) y el método de instancia al definir variables de instancia, así como la referencia de información de clase de la clase principal.
2. Crear el objeto 1. Asigne la memoria requerida para el objeto en el área del montón. La memoria asignada incluye todas las variables de instancia de la clase y superclase, pero no incluye ninguna variable estática. 2. Asigne valores predeterminados a todas las variables de instancia, copie las definiciones de las variables de instancia en el área de método al área del montón y luego asigne valores predeterminados.
3. La secuencia de inicialización para ejecutar el código de inicialización de la instancia es inicializar primero la clase principal y luego inicializar la subclase. Durante la inicialización, primero se ejecuta el bloque de código de instancia y luego se ejecuta el método constructor. 4. Si hay una referencia C en forma de Childc = newChild (), defina la variable de referencia de subtipo C en el área de la pila y luego asígnele la dirección del objeto del área del montón. Cabe señalar que cada objeto de subclase contiene una referencia al objeto de clase principal. El objeto de clase principal se puede llamar internamente mediante la palabra clave super y no es accesible externamente.