Enlace estático vs dinámico en Java

Hay ciertos puntos clave que deben recordarse antes de seguir adelante, donde discutiremos e implementaremos enlaces estáticos y dinámicos en Java y luego concluiremos las diferencias.  

  • Los miembros privados, finales y estáticos (métodos y variables) usan enlaces estáticos, mientras que para los métodos virtuales (en Java, los métodos son virtuales de forma predeterminada), el enlace se realiza durante el tiempo de ejecución en función del objeto de tiempo de ejecución.
  • El enlace estático usa información de tipo para el enlace, mientras que el enlace dinámico usa objetos para resolver el enlace.
  • Los métodos sobrecargados se resuelven (decidir a qué método se llamará cuando hay varios métodos con el mismo nombre) mediante enlace estático, mientras que los métodos anulados utilizan enlace dinámico, es decir, en tiempo de ejecución.

Enlace estático

El enlace que el compilador puede resolver en tiempo de compilación se conoce como enlace estático o anticipado. El enlace de todos los métodos estáticos, privados y finales se realiza en tiempo de compilación.

Ejemplo:

Java

// Java Program to Illustrate Static Binding
 
// Main class
class NewClass {
 
    // Static nested inner class
    // Class 1
    public static class superclass {
 
        // Method of inner class
        static void print()
        {
 
            // Print statement
            System.out.println(
                "print() in superclass is called");
        }
    }
 
    // Static nested inner class
    // Class 2
    public static class subclass extends superclass {
 
        // Method of inner class
        static void print()
        {
 
            // print statement
            System.out.println(
                "print() in subclass is called");
        }
    }
 
    // Method of main class
    // Main driver method
    public static void main(String[] args)
    {
 
        // Creating objects of static inner classes
        // inside main() method
        superclass A = new superclass();
        superclass B = new subclass();
 
        // Calling method over above objects
        A.print();
        B.print();
    }
}
Producción

print() in superclass is called
print() in superclass is called

Salida Explicación: Como puede ver, en ambos casos se llama al método de impresión de la superclase. Discutamos cómo sucede esto. 

  • Hemos creado un objeto de subclase y un objeto de superclase con la referencia de la superclase.
  • Dado que el método de impresión de la superclase es estático, el compilador sabe que no se anulará en las subclases y, por lo tanto, el compilador sabe durante el tiempo de compilación qué método de impresión llamar y, por lo tanto, no hay ambigüedad.

Como ejercicio, el lector puede cambiar la referencia del objeto B a la subclase y luego verificar la salida. 

Enlace dinámico

En el compilador de enlace dinámico, no decide el método que se llamará. La anulación es un ejemplo perfecto de vinculación dinámica. Al anular, tanto las clases principales como las secundarias tienen el mismo método.

Ejemplo:

Java

// Java Program to Illustrate Dynamic Binding
 
// Main class
public class GFG {
 
    // Static nested inner class
    // Class 1
    public static class superclass {
 
        // Method of inner class 1
        void print()
        {
 
            // Print statement
            System.out.println(
                "print in superclass is called");
        }
    }
 
    // Static nested inner class
    // Class 2
    public static class subclass extends superclass {
 
        // Method of inner class 2
        @Override void print()
        {
 
            // Print statement
            System.out.println(
                "print in subclass is called");
        }
    }
 
    // Method inside main class
    public static void main(String[] args)
    {
 
        // Creating object of inner class 1
        // with reference to constructor of super class
        superclass A = new superclass();
 
        // Creating object of inner class 1
        // with reference to constructor of sub class
        superclass B = new subclass();
 
        // Calling print() method over above objects
        A.print();
        B.print();
    }
}
Producción

print in superclass is called
print in subclass is called

Salida Explicación: Aquí la salida difiere. ¿Pero por qué? Analicemos el código y entendámoslo a fondo. 

  • Los métodos no son estáticos en este código.
  • Durante la compilación, el compilador no tiene idea de a qué impresión se debe llamar, ya que el compilador solo hace referencia a la variable, no al tipo de objeto y, por lo tanto, el enlace se retrasaría hasta el tiempo de ejecución y, por lo tanto, la versión correspondiente de la impresión será llamado basado en el tipo de un objeto.

Sugerencia: Geeks, ahora surge la pregunta: ¿por qué el enlace de métodos estáticos, finales y privados siempre es un enlace estático? 

El enlace estático es mejor en cuanto a rendimiento (no se requiere sobrecarga adicional). El compilador sabe que todos estos métodos no pueden anularse y que los objetos de la clase local siempre accederán a ellos. Por lo tanto, el compilador no tiene ninguna dificultad para determinar el objeto de la clase (clase local seguro). Esa es la razón por la cual el enlace para tales métodos es estático. 

Veamos ahora finalmente las diferencias entre el enlace estático y dinámico que es el siguiente: 

Enlace estático Enlace dinámico
Tiene lugar en el momento de la compilación, por lo que se denomina enlace anticipado. Se lleva a cabo en tiempo de ejecución, por lo que se denomina enlace tardío.  
Utiliza la sobrecarga con mayor precisión el método de sobrecarga del operador. Utiliza métodos de anulación.
Se lleva a cabo usando funciones normales.  Se lleva a cabo mediante funciones virtuales.  
Los objetos reales nunca usan enlace estático Los objetos reales usan enlaces dinámicos.

Este artículo es una contribución de Rishabh Mahrsee. Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *