¿Cuál es la diferencia entre polymorphism dynamic y estático en Java?

¿Alguien puede proporcionar un ejemplo simple que explique la diferencia entre el polymorphism dynamic y el estático en Java?

Polimorfismo

1. Enlace estático / enlace de tiempo de comstackción / enlace anticipado / sobrecarga de método (en la misma clase)

2. Encuadernación dinámica / Encuadernación en tiempo de ejecución / Encuadernación tardía / Anulación de método (en diferentes clases)

ejemplo de sobrecarga:

class Calculation { void sum(int a,int b){System.out.println(a+b);} void sum(int a,int b,int c){System.out.println(a+b+c);} public static void main(String args[]) { Calculation obj=new Calculation(); obj.sum(10,10,10); // 30 obj.sum(20,20); //40 } } 

ejemplo primordial:

 class Animal { public void move(){ System.out.println("Animals can move"); } } class Dog extends Animal { public void move() { System.out.println("Dogs can walk and run"); } } public class TestDog { public static void main(String args[]) { Animal a = new Animal(); // Animal reference and object Animal b = new Dog(); // Animal reference but Dog object a.move();//output: Animals can move b.move();//output:Dogs can walk and run } } 
  • La sobrecarga del método sería un ejemplo de polymorphism estático

  • mientras que anular sería un ejemplo de polymorphism dynamic.

    Porque, en caso de sobrecarga, en tiempo de comstackción el comstackdor sabe qué método vincular a la llamada. Sin embargo, se determina en tiempo de ejecución para el polymorphism dynamic

El polymorphism dynamic (tiempo de ejecución) es el polymorphism existente en el tiempo de ejecución. Aquí, el comstackdor de Java no entiende qué método se llama en el tiempo de comstackción. Solo JVM decide qué método se llama en tiempo de ejecución. La sobrecarga de métodos y la anulación de métodos utilizando métodos de instancia son ejemplos de polymorphism dynamic.

Por ejemplo,

  • Considere una aplicación que serializa y deserializa diferentes tipos de documentos.

  • Podemos tener ‘Documento’ como la clase base y las diferentes clases de tipos de documentos que se derivan de él. Por ejemplo, XMLDocument, WordDocument, etc.

  • La clase de documento definirá los métodos ‘Serialize ()’ y ‘De-serialize ()’ como virtuales y cada clase derivada implementará estos métodos a su manera en función del contenido real de los documentos.

  • Cuando los diferentes tipos de documentos necesitan ser serializados / deserializados, los objetos del documento serán referidos por la referencia (o puntero) de la clase ‘Documento’ y cuando se llaman los métodos ‘Serialize ()’ o ‘De-serialize ()’ en él, se llaman versiones apropiadas de los métodos virtuales.

El polymorphism estático (tiempo de comstackción) es el polymorphism exhibido en tiempo de comstackción. Aquí, el comstackdor de Java sabe a qué método se llama. Sobrecarga de métodos y anulación de métodos con métodos estáticos; método de anulación utilizando métodos privados o finales son ejemplos de polymorphism estático

Por ejemplo,

  • Un objeto empleado puede tener dos métodos print () uno que no toma argumentos y otro que toma una cadena de prefijo que se mostrará junto con los datos del empleado.

  • Dadas estas interfaces, cuando se llama al método print () sin ningún argumento, el comstackdor, mirando los argumentos de la función, sabe qué función se debe invocar y genera el código del objeto en consecuencia.

Para obtener más información, lea “Qué es el polymorphism” (Google it).

Polimorfismo: polymorphism es la capacidad de un objeto para tomar muchas formas. El uso más común de polymorphism en OOP ocurre cuando se usa una referencia de clase principal para referirse a un objeto de clase hijo.

Polimorfismo dynamic de unión / tiempo de ejecución:

Polimorfismo de tiempo de ejecución también conocido como anulación de método. En este Mecanismo por el cual una llamada a una función anulada se resuelve en un tiempo de ejecución.

 public class DynamicBindingTest { public static void main(String args[]) { Vehicle vehicle = new Car(); //here Type is vehicle but object will be Car vehicle.start(); //Car's start called because start() is overridden method } } class Vehicle { public void start() { System.out.println("Inside start method of Vehicle"); } } class Car extends Vehicle { @Override public void start() { System.out.println("Inside start method of Car"); } } 

Salida:

Método de inicio de arranque del coche

Polimorfismo estático de unión / tiempo de comstackción:

El método que se debe invocar se decide únicamente en tiempo de comstackción.

 public class StaticBindingTest { public static void main(String args[]) { Collection c = new HashSet(); StaticBindingTest et = new StaticBindingTest(); et.sort(c); } //overloaded method takes Collection argument public Collection sort(Collection c){ System.out.println("Inside Collection sort method"); return c; } //another overloaded method which takes HashSet argument which is sub class public Collection sort(HashSet hs){ System.out.println("Inside HashSet sort method"); return hs; } } 

Salida: Inside Collection sort meto

La sobrecarga de métodos es un ejemplo de compile time de compile time / static polymorphism porque el enlace de métodos entre la llamada al método y la definición del método ocurre en tiempo de comstackción y depende de la referencia de la clase (referencia creada en tiempo de comstackción y va a la stack).

la anulación de método es un ejemplo de dynamic polymorphism run time de run time / dynamic polymorphism porque el enlace de método entre llamada de método y definición de método ocurre en tiempo de ejecución y depende del objeto de la clase (objeto creado en tiempo de ejecución y va al montón).

En lenguaje sencillo :

Polimorfismo estático : el mismo nombre del método está sobrecargado con diferentes tipos o números de parámetros en la misma clase (firma diferente). La llamada al método dirigido se resuelve en tiempo de comstackción.

Polimorfismo dynamic : el mismo método se anula con la misma firma en diferentes clases . El tipo de objeto en el que se invoca el método no se conoce en tiempo de comstackción, pero se decidirá en tiempo de ejecución.

En general, la sobrecarga no se considerará como polymorphism.

Desde la página de tutorial de Java:

Las subclases de una clase pueden definir sus propios comportamientos únicos y aun así compartir algunas de las mismas funcionalidades de la clase padre

La vinculación se refiere al enlace entre la llamada al método y la definición del método.

Esta imagen muestra claramente lo que es vinculante.

Unión

En esta imagen, la llamada “a1.methodOne ()” es vinculante para la correspondiente definición de methodOne () y la llamada “a1.methodTwo ()” es vinculante para la correspondiente definición de methodTwo ().

Para cada llamada de método, debe haber una definición de método adecuada. Esta es una regla en Java. Si el comstackdor no ve la definición de método adecuada para cada llamada de método, arroja un error.

Ahora, ven al enlace estático y enlace dynamic en java.

Enlace estático en Java:

La vinculación estática es una vinculación que ocurre durante la comstackción. También se llama enlace anticipado porque la vinculación ocurre antes de que un progtwig realmente se ejecute

.

La unión estática se puede demostrar como en la imagen de abajo.

enter image description here

En esta imagen, ‘a1’ es una variable de referencia de tipo Clase A que apunta al objeto de clase A. ‘a2’ también es una variable de referencia de tipo clase A pero apunta al objeto de Clase B.

Durante la comstackción, mientras se vincula, el comstackdor no verifica el tipo de objeto al que apunta una variable de referencia particular. Simplemente verifica el tipo de variable de referencia a través de la cual se llama un método y verifica si existe una definición de método para ese tipo.

Por ejemplo, para la llamada al método “a1.method ()” en la imagen de arriba, el comstackdor verifica si existe una definición de método para el método () en la Clase A. Porque ‘a1’ es del tipo Clase A. De manera similar, para la llamada al método “a2.method ()”, verifica si existe una definición de método para el método () en la Clase A. Porque ‘a2’ también es del tipo Clase A. No verifica a qué objeto apuntan ‘a1’ y ‘a2’. Este tipo de enlace se denomina enlace estático.

Encuadernación dinámica en Java:

La vinculación dinámica es una vinculación que ocurre durante el tiempo de ejecución. También se llama enlace tardío porque el enlace ocurre cuando el progtwig realmente se está ejecutando.

Durante el tiempo de ejecución, los objetos reales se usan para vincular. Por ejemplo, para la llamada “a1.method ()” en la imagen de arriba, se invocará el método () del objeto real al que apunta ‘a1’. Para la llamada “a2.method ()”, se invocará el método () del objeto real al que apunta ‘a2’. Este tipo de enlace se llama enlace dynamic.

La vinculación dinámica del ejemplo anterior se puede demostrar como a continuación.

enter image description here

Referencia static-binding-and-dynamic-binding-in-java

Polimorfismo estático: es donde la decisión de resolver qué método lograr se determina durante el tiempo de comstackción. Método de sobrecarga podría ser un ejemplo de esto.

Polimorfismo dynamic: es donde la decisión de elegir qué método ejecutar se establece durante el tiempo de ejecución. Método Overriding podría ser un ejemplo de esto.

La sobrecarga de métodos se conoce como polymorphism estático y también conocida como polymorphism de tiempo de comstackción o enlace estático porque el comstackdor resuelve las llamadas a los métodos sobrecargadas en tiempo de comstackción sobre la base de la lista de argumentos y la referencia sobre la que estamos llamando al método.

Y la anulación de método se conoce como polymorphism dynamic o polymorphism simple o despacho de método de tiempo de ejecución o enlace dynamic porque la llamada al método anulado se resuelve en el tiempo de ejecución.

Para entender por qué esto es así, tomemos un ejemplo de Mammal y Clase Human

 class Mammal { public void speak() { System.out.println("ohlllalalalalalaoaoaoa"); } } class Human extends Mammal { @Override public void speak() { System.out.println("Hello"); } public void speak(String language) { if (language.equals("Hindi")) System.out.println("Namaste"); else System.out.println("Hello"); } } 

He incluido la salida y el bytecode de las líneas de código a continuación

 Mammal anyMammal = new Mammal(); anyMammal.speak(); // Output - ohlllalalalalalaoaoaoa // 10: invokevirtual #4 // Method org/programming/mitra/exercises/OverridingInternalExample$Mammal.speak:()V Mammal humanMammal = new Human(); humanMammal.speak(); // Output - Hello // 23: invokevirtual #4 // Method org/programming/mitra/exercises/OverridingInternalExample$Mammal.speak:()V Human human = new Human(); human.speak(); // Output - Hello // 36: invokevirtual #7 // Method org/programming/mitra/exercises/OverridingInternalExample$Human.speak:()V human.speak("Hindi"); // Output - Namaste // 42: invokevirtual #9 // Method org/programming/mitra/exercises/OverridingInternalExample$Human.speak:(Ljava/lang/String;)V 

Y mirando el código anterior, podemos ver que los códigos de byte de HumanMammal.speak (), human.speak () y human.speak (“Hindi”) son totalmente diferentes porque el comstackdor puede diferenciarlos según la lista de argumentos y referencia de clase. Y esta es la razón por la cual la sobrecarga de métodos se conoce como polymorphism estático .

Pero bytecode para anyMammal.speak () y humanMammal.speak () es lo mismo porque de acuerdo con el comstackdor se invocan ambos métodos en la referencia Mammal pero la salida para ambas llamadas a métodos es diferente porque en tiempo de ejecución JVM sabe qué objeto está reteniendo una referencia y las llamadas JVM el método en el objeto y esta es la razón por la cual el método Overriding se conoce como Polimorfismo Dinámico.

Por lo tanto, desde el código y el código de bytes anteriores, está claro que durante la fase de comstackción, el método de llamada se considera a partir del tipo de referencia. Pero en el momento de la ejecución se llamará al método desde el objeto que contiene la referencia.

Si desea saber más acerca de esto, puede leer más sobre cómo JVM maneja sobrecarga y sobreescritura del método internamente .

Tiempo de comstackción del polymorphism (enlace estático / vinculación temprana): en el polymorphism estático, si llamamos a un método en nuestro código, entonces, la definición de ese método que se va a llamar en realidad se resuelve solo en tiempo de comstackción.

(o)

En tiempo de comstackción, Java sabe qué método invocar comprobando las firmas de método. Por lo tanto, esto se llama polymorphism en tiempo de comstackción o enlace estático.

Polimorfismo dynamic (enlace tardío / polymorphism de tiempo de ejecución): en tiempo de ejecución, Java espera hasta el tiempo de ejecución para determinar a qué objeto apunta realmente la referencia. La resolución del método se tomó en tiempo de ejecución, debido a que llamamos polymorphism de tiempo de ejecución.

La sobrecarga de métodos es un polymorphism en tiempo de comstackción, tomemos un ejemplo para comprender el concepto.

 class Person //person.java file { public static void main ( String[] args ) { Eat e = new Eat(); e.eat(noodle); //line 6 } void eat (Noodles n) //Noodles is a object line 8 { } void eat ( Pizza p) //Pizza is a object { } } 

En este ejemplo, la persona tiene un método de comer que representa que puede comer pizza o fideos. Que el método eat está sobrecargado cuando comstackmos esta Person.java el comstackdor resuelve el método llamado “e.eat (fideos) [que está en la línea 6] con la definición de método especificada en la línea 8 que es el método que toma fideos como parámetro y todo el proceso lo realiza el comstackdor, por lo que es Polimorfismo de tiempo de comstackción. El proceso de reemplazo de la llamada a método con definición de método se denomina enlace, en este caso, lo realiza el comstackdor, por lo que se denomina enlace anticipado.

El polymorphism se refiere a la capacidad de un objeto para comportarse de manera diferente para el mismo desencadenador.

Polimorfismo estático (Polimorfismo en tiempo de comstackción)

  • El polymorphism estático decide qué método ejecutar durante el tiempo de comstackción.
  • Método La sobrecarga es un ejemplo de polymorphism estático, y es necesario que ocurra el polymorphism estático.
  • Polimorfismo estático logrado a través de enlace estático.
  • El polymorphism estático ocurre en la misma clase.
  • La asignación de objetos no es necesaria para el polymorphism estático.
  • Herencia no involucrada para el polymorphism estático.

Polimorfismo dynamic (polymorphism en tiempo de ejecución)

  • El polymorphism dynamic decide qué método ejecutar en tiempo de ejecución.
  • Método Overriding es un ejemplo de polymorphism dynamic, y es necesario que ocurra polymorphism dynamic.
  • Polimorfismo dynamic logrado a través de enlace dynamic.
  • El polymorphism dynamic ocurre entre diferentes clases.
  • Se requiere cuando se asigna un objeto de subclase al objeto de superclase para el polymorphism dynamic.
  • Herencia involucrada para el polymorphism dynamic.