El enlace de la llamada al método con el cuerpo del método se conoce como enlace. Hay dos tipos de encuadernación: Enlace estático esto sucede durante la compilación e Asociación dinámica esto sucede en tiempo de ejecución. Antes de explicar la asociación estática y dinámica en Java, veamos algunos términos que lo ayudarán a comprender mejor este concepto.
¿Qué son referencia y objeto?
class Human{ .... } class Boy extends Human{ public static void main( String args[]) { /*This statement simply creates an object of class *Boy and assigns a reference of Boy to it*/ Boy obj1 = new Boy(); /* Since Boy extends Human class. The object creation * can be done in this way. Parent class reference * can have child class reference assigned to it */ Human obj2 = new Boy(); } }
Enlace estático y dinámico en Java
Como se mencionó anteriormente, vincular la definición del método a la llamada al método se conoce como vinculación. Hay dos tipos de enlace: enlace estático y enlace dinámico. Vamos a hablar acerca de.
Enlace estático o enlace temprano
La asociación que el compilador puede resolver en tiempo de compilación se conoce como asociación estática o temprana. Se está compilando el enlace de métodos estáticos, privados y finales. ¿Por qué? La razón es que el método these no se puede anular y el tipo de clase se determina en tiempo de compilación. Veamos un ejemplo para entender esto:
Ejemplo de asociación estática
Aquí tenemos dos clases Human y Boy. Ambas clases tienen el mismo método walk () pero el método es estático, lo que significa que no se puede anular, por lo que, aunque utilicé el objeto de la clase Boy al crear el objeto obj, este llama al método de la clase principal. Porque la referencia es de tipo Humano (clase padre). Por lo tanto, siempre que se produce un enlace de métodos estáticos, privados y finales, el compilador determina el tipo de clase en el momento de la compilación y el enlace se produce en ese momento.
class Human{ public static void walk() { System.out.println("Human walks"); } } class Boy extends Human{ public static void walk(){ System.out.println("Boy walks"); } public static void main( String args[]) { /* Reference is of Human type and object is * Boy type */ Human obj = new Boy(); /* Reference is of HUman type and object is * of Human type. */ Human obj2 = new Human(); obj.walk(); obj2.walk(); } }
Producción:
Human walks Human walks
Enlace dinámico o enlace tardío
Cuando el compilador no puede resolver la llamada / asociación en tiempo de compilación, esa asociación se conoce como asociación dinámica o tardía. Anular el método es un ejemplo perfecto de enlace dinámico, ya que al anular las clases padre e hijo tienen el mismo método y en este caso el tipo de objeto determina qué método se debe realizar. El tipo de objeto se determina en tiempo de ejecución, por lo que esto se conoce como enlace dinámico.
Ejemplo de asociación dinámica
Este es el mismo ejemplo que vimos anteriormente. La única diferencia aquí es que en este ejemplo, la anulación está realmente sucediendo ya que estos métodos son no estático, privado y final. En el caso de una anulación, la llamada al método anulado se determina en tiempo de ejecución por el tipo de objeto, por lo que se produce un enlace tardío. Veamos un ejemplo para entender esto:
class Human{ //Overridden Method public void walk() { System.out.println("Human walks"); } } class Demo extends Human{ //Overriding Method public void walk(){ System.out.println("Boy walks"); } public static void main( String args[]) { /* Reference is of Human type and object is * Boy type */ Human obj = new Demo(); /* Reference is of HUman type and object is * of Human type. */ Human obj2 = new Human(); obj.walk(); obj2.walk(); } }
Producción:
Boy walks Human walks
Como puede ver, el resultado es diferente de lo que vimos en el ejemplo de enlace estático, porque en este caso, al crear el objeto obj, el tipo de objeto se determina como un tipo Boy, por lo que la clase Boy. Recuerde que el tipo de objeto se determina en tiempo de ejecución.
Enlace estático vs enlace dinámico
Hablemos de la diferencia entre el enlace estático y dinámico en Java.
- El enlace estático se produce en tiempo de compilación, mientras que el enlace dinámico se produce en tiempo de ejecución.
- El enlace de métodos privados, estáticos y finales siempre se produce en tiempo de compilación, ya que estos métodos no se pueden invalidar. Cuando la anulación del método está realmente en curso y la referencia de tipo principal se asigna al objeto de tipo de clase secundaria, esa asociación se resuelve en tiempo de ejecución.
- El enlace de métodos sobrecargados es estático y el enlace de métodos anulados es dinámico.