La diferencia entre enlace estático y dinámico en Java

Mohammad Irfan 12 octubre 2023
  1. Enlace estático en Java
  2. Ejemplo de enlace estático en Java
  3. Enlace dinámico en Java
  4. Ejemplo de enlace dinámico en Java
  5. Enlace estático y enlace dinámico en Java
La diferencia entre enlace estático y dinámico en Java

Este tutorial presenta la diferencia entre el enlace estático y el enlace dinámico en Java y enumera algunos códigos de ejemplo para guiarlo en el tema.

La vinculación es vincular una llamada a un método a la implementación del método y tiene dos tipos: estática y dinámica. Según el polimorfismo, un objeto puede tener muchas formas, y estas formas se pueden resolver en tiempo de compilación o en tiempo de ejecución.

La vinculación estática ocurre cuando la llamada al método está vinculada a la implementación del método en tiempo de compilación. El enlace dinámico se produce cuando el enlace tiene lugar durante el tiempo de ejecución. Aprendamos más sobre estos dos tipos de enlace y veamos algunos ejemplos.

Enlace estático en Java

Como se mencionó anteriormente, el enlace estático es el enlace que se produce durante el tiempo de compilación. También se conoce como enlace anticipado porque se produce durante el tiempo de compilación.

En el caso de Static Binding, el compilador sabe exactamente qué implementación del método usar. Utiliza la información de tipo o clase para la vinculación; La sobrecarga de métodos es un ejemplo de enlace estático.

Tenga en cuenta que todos los métodos estáticos, finales y privados utilizan el enlace estático porque las clases secundarias no pueden anular los métodos estáticos, finales y privados. El compilador sabe en tiempo de compilación qué implementación de método usar. Dado que el compilador sabe que los métodos de la clase principal no se pueden anular, siempre usa la implementación de la clase principal del método.

Además, el enlace estático también funciona mejor, ya que implica menos gastos generales.

Ejemplo de enlace estático en Java

En el código siguiente, la clase de la escuela tiene un método estático ringBell(), y esta clase se amplía con Classroom. El Classroom también tiene un método ringBell().

Dado que el método ringBell() es estático, el compilador solo verifica el tipo de clase y no considera la clase de objeto asignada. Por tanto, cuando se utiliza una clase School para crear un objeto de Classroom(School s2 = new Classroom()), se considera la implementación de la clase School y no la clase Classroom.

class School {
  public static void ringBell() {
    System.out.println("Ringing the school bell...");
  }
}
class Classroom extends School {
  public static void ringBell() {
    System.out.println("Ringing the classroom bell...");
  }
}
public class Main {
  public static void main(String[] args) {
    School s1 = new School(); // Type is School
    s1.ringBell();
    Classroom c1 = new Classroom(); // Type is Classroom
    c1.ringBell();
    School s2 = new Classroom(); // Type is School
    s2.ringBell();
  }
}

Producción :

Ringing the school bell...
Ringing the classroom bell...
Ringing the school bell...

Enlace dinámico en Java

El enlace dinámico resuelve el enlace en tiempo de ejecución porque el compilador no sabe qué implementación usar en tiempo de compilación.

También se conoce como enlace tardío porque el enlace se resuelve en una etapa posterior durante el tiempo de ejecución y no durante el tiempo de compilación. El enlace dinámico también utiliza el objeto para el enlace y no el tipo o la clase; La anulación de método es un ejemplo de enlace dinámico.

Ejemplo de enlace dinámico en Java

En el código siguiente, el método ringBell() no es estático, por lo que se producirá una anulación. El compilador no sabe qué implementación del método ringBell() debe usarse, por lo que el enlace se resuelve en tiempo de ejecución.

En tiempo de ejecución, se considera el objeto y no el tipo que se utilizó para crearlo. Por tanto, cuando se utiliza una clase School para crear un objeto de Classroom, se considera la implementación de la clase Classroom y no la clase School.

class School {
  public void ringBell() {
    System.out.println("Ringing the school bell...");
  }
}
class Classroom extends School {
  @Override
  public void ringBell() {
    System.out.println("Ringing the classroom bell...");
  }
}
public class Main {
  public static void main(String[] args) {
    School s1 = new School(); // Type is School and object is of School
    s1.ringBell();
    Classroom c1 = new Classroom(); // Type is Classroom and object is of Classroom
    c1.ringBell();
    School s2 = new Classroom(); // Type is School and object is of Classroom
    s2.ringBell();
  }
}

Producción :

Ringing the school bell...
Ringing the classroom bell...
Ringing the classroom bell...

Enlace estático y enlace dinámico en Java

El enlace estático es la conexión de la llamada al método a la implementación del método en tiempo de compilación. Por otro lado, Dynamic Binding es la conexión de la llamada al método a la implementación del método en tiempo de ejecución.

Conocer ambas técnicas es importante para comprender el concepto de polimorfismo. La vinculación estática se utiliza mediante métodos estáticos, finales y privados; este enlace entra en acción en el caso de métodos sobrecargados. El enlace dinámico se utiliza para métodos virtuales (de forma predeterminada, virtual en Java) y se utiliza para enlazar métodos anulados.

Artículo relacionado - Java Method