Java estática y unión dinámica
Recientemente, aprendí el conocimiento de Java y aprendí la vinculación estática y dinámica de Java. Luego resumí y resolví el conocimiento correspondiente sobre Baidu para ayudar a dominar esta parte del conocimiento.
El concepto de vinculación del programa:
La unión se refiere a la asociación de una llamada de método con la clase (el cuerpo del método) donde se encuentra el método. Para Java, la unión se divide en unión estática y unión dinámica; o se llama vinculación temprana y vinculación tardía.
Aking estático:
El método está vinculado antes de ejecutar el programa (es decir, ya sabe qué clase está el método en el proceso de compilación), y el compilador u otros programas de conexión lo implementan. Por ejemplo: C.
Se puede entender simplemente como vinculante durante el período de compilación del programa para Java; Aquí hay particularmente claro que los únicos métodos en Java son finales, estáticos, privados y constructores que están previamente vinculantes
Enlace dinámico:
Vínculos posteriores: se une de acuerdo con el tipo de objeto específico en tiempo de ejecución.
Si un lenguaje implementa la unión tardía, también debe proporcionar algunos mecanismos para determinar el tipo de objeto durante la operación y llamar a los métodos apropiados por separado. En otras palabras, el compilador todavía no conoce el tipo de objeto en este momento, pero el mecanismo de llamadas del método puede investigarlo por sí mismo y encontrar el cuerpo del método correcto. Diferentes idiomas tienen diferentes formas de implementar la vinculación tardía. Pero al menos podemos pensar de esta manera: todos necesitan instalar ciertos tipos especiales de información en el objeto.
Proceso de enlace dinámico:
Final, estático, privado y constructores son la comprensión de la unión temprana
Para el método privado, en primer lugar, no se puede heredar. Dado que no se puede heredar, no hay forma de llamarlo a través del objeto de su subclase, pero solo puede llamarse a través del objeto de esta clase misma. Por lo tanto, se puede decir que el método privado está vinculado a la clase que define este método.
Aunque el método final puede ser heredado, no se puede sobrescribir (anulado). Aunque se puede llamar al objeto de clase infantil, se llama al método final definido en la clase principal (a partir de esto podemos saber que el método se declara como tipo final, uno es evitar que el método se sobrescriba, y el otro es cerrar efectivamente la unión dinámica en Java).
Los constructores no se pueden heredar (también se dice que los subclases heredan incondicionalmente el constructor sin parámetros de la clase principal como su constructor, pero personalmente creo que esta declaración es inapropiada, porque sabemos que los subclases llaman a la clase matriz sin construcción a través de Super () para completar la inicialización de la clase principal. heredar el constructor de la clase principal). Por lo tanto, también puede saber a qué clase pertenece este constructor al compilar.
No puedo explicar bien los principios específicos del método estático. Sin embargo, según la información en línea y mi propio experimento, podemos concluir que el método estático puede ser heredado por subclases, pero no puede reescribirse (anulado) por subclases, pero puede ser oculto por subclases. (Esto significa que si hay un método estático en la clase principal y si no hay un método correspondiente en su subclase, entonces el método en la clase principal se usará cuando la clase infantil llame a este método. Y si el mismo método se define en la clase infantil, el método definido en la clase infantil se llamará. La única diferencia es que cuando el objeto de la clase infantil se transforma en un objeto de la clase principal, la clase de falta de si el método Static se define en el objeto de la clase del niño, el método de la clase del niño se transformará en la clase de la clase, el método de la clase de la clase, el método de la clase estatic en el método de la clase, el objetivo de la clase estatic en el objetivo de la clase estatic en el método de la clase, el objetivo de la clase de la clase, el método de la clase estatic en el que se define el método de la clase. La clase principal, independientemente de si la clase de niños tiene este método estático.
De lo anterior podemos concluir que si un método no puede heredarse o no se puede sobrescribir después de la herencia, entonces este método adopta la unión estática.
Compilación y operación de Java
El proceso de compilación Java es el proceso de compilar el archivo de origen Java en Bytecode (código ejecutable JVM, es decir, archivo .class). En este proceso, Java no se ocupa de la memoria. En este proceso, el compilador realizará un análisis de sintaxis. Si la sintaxis es incorrecta, se informará un error.
El proceso de ejecución de Java se refiere a JVM (Java Virtual Machine) Cargando archivos ByTecode e interpretando la ejecución. En este proceso, es la creación real del diseño de memoria y la ejecución de los programas Java.
Hay dos formas de ejecutar Java Bytecode: (1) Método de compilación instantánea: el intérprete primero compila los bytes en el código de la máquina y luego ejecuta el código de la máquina; (2) Método de ejecución de explicación: el intérprete completa todas las operaciones del programa de Bytecode Java interpretando y ejecutando una pequeña pieza de código cada vez. (Aquí podemos ver que el programa Java realmente sufre dos conversiones durante el proceso de ejecución, se convierte primero en bytecode y luego se convierte en código de máquina. Esta es la razón por la cual Java puede compilarse y ejecutarse en todas partes de una sola vez. Instalación de la máquina virtual Java correspondiente en diferentes plataformas puede realizar el mismo código de by -machine en diferentes plataformas, así como para correr en diferentes plataformas))
Como se mencionó anteriormente, para los métodos en Java, a excepción de los constructores finales, estáticos, privados y que son enlaces tempranos, todos los demás métodos son enlaces dinámicos.
La unión dinámica típica ocurre bajo la declaración de conversión de la clase principal y la clase infantil:
Por ejemplo: Parent P = New Children ();
Los detalles específicos del proceso son los siguientes:
1: El compilador verifica el tipo de declaración y el nombre del método del objeto.
Supongamos que llamamos al método XF (args) y X se ha declarado como un objeto de la clase C, entonces el compilador enumerará todos los métodos nombrados F en los métodos de clase C y F heredados de la superclase de la clase C.
2: A continuación, el compilador verifica el tipo de parámetro proporcionado en la llamada de método.
Si un tipo de parámetro entre todos los métodos con el nombre F coincide con el tipo de parámetro proporcionado por la llamada más, entonces se llama a este método. Este proceso se llama "resolución de sobrecarga".
3: Cuando el programa se ejecuta y usa la vinculación dinámica a los métodos de llamadas, la máquina virtual debe llamar a una versión de método que coincida con el tipo real del objeto apuntado por x.
Suponga que el tipo real es D (una subclase de C), si la clase D define f (cadena), entonces se llama el método, de lo contrario el método f (cadena) se buscará en la superclase de D, y así sucesivamente.
Cuando una máquina virtual Java llama a un método de clase (método estático), selecciona el método llamado basado en el tipo de referencia de objeto (generalmente conocido en el tiempo de compilación). Por el contrario, cuando una máquina virtual llama a un método de instancia, seleccionará el método llamado basado en el tipo real del objeto (solo conocido en tiempo de ejecución). Esto es unión dinámica, que es un tipo de polimorfismo. La vinculación dinámica proporciona una gran flexibilidad para resolver problemas comerciales reales y es un mecanismo muy hermoso.
A diferencia de los métodos, cuando se trata de variables de miembros (variables de instancia y variables de clase) en las clases de Java, no es vinculante en tiempo de ejecución, sino vinculación estática en el sentido general. Entonces, en el caso de la transformación ascendente, el método del objeto puede encontrar la subclase, mientras que el atributo del objeto (variable de miembro) sigue siendo el atributo de la clase principal (la subclase se oculta de la variable de miembro de la clase principal).
Padre de clase pública {name de cadena protegida = "atributo padre"; } El hijo de clase pública extiende el padre {name de cadena protegida = "atributo de hijo"; public static void main (string [] args) {padre muestra = new son (); System.out.println ("Llamada propiedad:" + sample.name); }} Conclusión: La persona que llama es el atributo del Padre.
Este resultado muestra que el objeto de la clase infantil (el mango de referencia de la clase principal) se llama a la variable de miembro de la clase principal. Por lo tanto, debe estar claro que la categoría dirigida por el tiempo de ejecución (dinámica) es solo el método de un objeto.
Ahora tratando de llamar al nombre de la variable del miembro de la subclase, ¿cómo hacerlo? La forma más fácil es encapsular la variable de miembro en un formulario de Getter de método.
El código es el siguiente:
Padre de clase pública {name de cadena protegida = "atributo padre"; public String getName () {nombre de retorno; }} El hijo de clase pública extiende el padre {name de cadena protegida = "atributo de hijo"; public String getName () {nombre de retorno; } public static void main (string [] args) {padre muestra = new son (); System.out.println ("llamada propiedad:" + sample.getName ()); }} Resultado: el atributo del hijo se llama
¿Por qué Java adopta métodos de unión estáticos para los atributos? Esto se debe a que la vinculación estática tiene muchos beneficios, lo que nos permite descubrir errores en el programa durante el período de compilación, en lugar de durante el período de ejecución. ¡Esto mejorará la eficiencia de operación del programa! La unión dinámica de los métodos es implementar el polimorfismo, que es una característica importante de Java. El polimorfismo es también una de las tecnologías clave orientadas a objetos, por lo que vale la pena que Java implemente el polimorfismo a costa de la eficiencia.
Nota: La mayor parte del contenido anterior proviene de Internet, y una pequeña parte es la opinión personal y de ninguna manera comentarios autorizados. Si hay algún lenguaje inapropiado o expresión incorrecta, espero darle consejos.
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!