Polimorfismo en Java (Estático y dinámico)

⚡ Resumen inteligente

Polimorfismo en Java Permite que una interfaz represente múltiples formas, de modo que un mismo nombre de método se comporta de manera diferente en clases relacionadas. Es un pilar del diseño orientado a objetos que fomenta la flexibilidad, la reutilización de código y la extensión limpia de sistemas bancarios, médicos y empresariales heredados.

  • 🎭 Muchas formas, un solo nombre: Polimorfismo en Java Permite que el mismo nombre de método se dirija a diferentes implementaciones en función del tipo de objeto real en el momento de la ejecución.
  • 🔀 Dos sabores: El polimorfismo en tiempo de compilación utiliza la sobrecarga de métodos, mientras que el polimorfismo en tiempo de ejecución utiliza la anulación de métodos a través de la herencia y la JVM.
  • ⛓️ Enlace estático frente a enlace dinámico: Las llamadas sobrecargadas se resuelven en tiempo de compilación mediante enlace estático, mientras que las llamadas anuladas se resuelven en tiempo de ejecución mediante enlace dinámico.
  • ✅ Poder de superpalabras clave: La palabra clave `super` permite que una subclase invoque la implementación de la clase padre antes de agregar su propio comportamiento especializado.
  • 🧪 Alcance en el mundo real: Las cuentas bancarias, las jerarquías del personal hospitalario y los motores de renderizado de formas dependen del polimorfismo para incorporar nuevos requisitos sin romper el código probado.

Polimorfismo en Java

¿Qué es el polimorfismo en Java?

Polimorfismo en Java El polimorfismo se produce cuando una o más clases u objetos se relacionan entre sí mediante herencia. Se refiere a la capacidad de un objeto para adoptar diversas formas. La herencia permite a los usuarios heredar atributos y métodos, y el polimorfismo utiliza estos métodos para realizar diferentes tareas. El objetivo es la comunicación, aunque el enfoque puede variar.

Por ejemplo, un teléfono inteligente se utiliza para comunicarse. El modo de comunicación puede ser una llamada, un mensaje de texto, un mensaje con imágenes o un correo electrónico. El objetivo es común, es decir, comunicarse, pero el enfoque es diferente. Este comportamiento es la esencia de PolimorfismoAhora aprenderemos sobre el polimorfismo en Java Con ejemplos de código, diagramas y explicaciones paso a paso.

Haga clic en aquí si el video no es accesible

¿Por qué usar el polimorfismo en? Java?

Polimorfismo en Java Se utiliza porque hace que el código sea flexible, reutilizable y más fácil de mantener. Una única variable de referencia de un tipo padre puede apuntar a varios objetos hijos, por lo que la misma llamada se adapta a cualquier subclase que se proporcione. Este patrón mantiene el código probado intacto mientras se añade nuevo comportamiento mediante subclases especializadas, razón por la cual frameworks como Spring y Jakarta EE dependen de él.

Java Polimorfismo en programación orientada a objetos con ejemplo

Consideremos una clase padre llamada Cuenta Con funciones para depositar y retirar fondos. La clase Cuenta tiene dos subclases. La operación de depósito y retiro es la misma para las cuentas de ahorro y corrientes, por lo que los métodos heredados de la clase Cuenta funcionarán.

Herencia única en Java

Java Ejemplo de polimorfismo

Cambio en el requisito de software

Hay un cambio en la especificación de requisitos, algo común en la industria del software. Se debe agregar la funcionalidad para una cuenta bancaria privilegiada con facilidad de sobregiro. El sobregiro es una facilidad que permite a un cliente retirar una cantidad mayor que el saldo disponible en la cuenta. El método de retiro para la cuenta privilegiada necesita una nueva implementación, mientras que el código probado en las cuentas de ahorro y corrientes permanece intacto. Ese aislamiento es la ventaja de OOPS.

Java Polimorfismo

Paso 1) Cuando se llama al método de retiro de la cuenta de ahorros, se ejecuta el método definido en la clase principal Account.

Java Polimorfismo

Paso 2) Cuando se llama al método de retiro para la cuenta privilegiada (facilidad de sobregiro), se ejecuta el método de retiro definido en la clase privilegiada. Este despacho es Polimorfismo en la programación orientada a objetos.

Java Polimorfismo

Anulación de método en Java

La anulación de métodos es el proceso de redefinir un método de la superclase dentro de una subclase. La subclase mantiene el mismo código.tract, pero proporciona una implementación nueva que se selecciona cuando se ejecuta el programa.

Reglas para anular métodos

  • La firma del método, es decir, el nombre del método, la lista de parámetros y el tipo de retorno, debe coincidir exactamente.
  • El método sobrescrito puede ampliar la accesibilidad, pero no restringirla. Si el método es privado en la clase base, la clase hija puede hacerlo público, pero no al revés.

Reglas para la anulación de métodos en Java

Ejemplo

class Doctor{
  public void treatPatient(){
  // treatPatient method
  
}
class Surgeon extends Doctor{
  public void treatPatient(){
  // treatPatient method
  }
}
class Run{
  public static void main (String args[]){
    Doctor doctorObj = new Doctor();
    // treatPatient method in class Doctor will be executed
    doctorObj.treatPatient();
   
    Surgeon surgeonObj = new Surgeon();
    // treatPatient method in class Surgeon will be executed
    surgeonObj.treatPatient();
  }
}

Diferencia entre sobrecarga de métodos y anulación de métodos

La sobrecarga de métodos ocurre dentro de la misma clase con el mismo nombre de método, pero con firmas diferentes. La sobreescritura de métodos ocurre entre clases padre-hijo, donde la subclase redefine un método declarado en la superclase.

Sobrecarga de métodos
Anulación de método
La sobrecarga de métodos se da en la misma clase, donde más de un método tiene el mismo nombre pero diferentes firmas. La sobreescritura de métodos se produce cuando uno de los métodos de la superclase se redefine en la subclase. En este caso, la firma del método permanece inalterada.
por ejemplo:

void sum (int a , int b);
void sum (int a , int b, int c);
void sum (float a, double b);
por ejemplo:

class X{
  public int sum(){
     // some code
  }
}
class Y extends X{
  public int sum(){
    //overridden method
    //signature is same
 }
}

¿Qué es el polimorfismo dinámico?

El polimorfismo dinámico en la programación orientada a objetos (POO) es el mecanismo que permite definir múltiples métodos con el mismo nombre y firma tanto en la superclase como en la subclase. La llamada a un método sobrescrito se resuelve en tiempo de ejecución mediante el enlace dinámico dentro de la JVM.

Ejemplo de polimorfismo dinámico

Una variable de referencia de la superclase puede hacer referencia a un objeto de la subclase:

 Doctor obj = new Surgeon();

Considere la siguiente afirmación:

obj.treatPatient();

Aquí la variable de referencia obj es de la clase padre, pero el objeto al que apunta es de la clase hija, como se muestra en el diagrama de polimorfismo.

La llamada obj.tratarPaciente() ejecutará el método treatPatient() de la subclase Surgeon. Cuando se utiliza una referencia de clase base para llamar a un método, la JVM decide qué método se invoca en función del objeto real al que apunta la referencia. Aunque obj es una referencia a Doctor, llama al método de Cirujano, porque apunta a un objeto Cirujano. La decisión se toma durante el tiempo de ejecución, por eso se denomina Polimorfismo dinámico o polimorfismo en tiempo de ejecución.

Diferencia entre polimorfismo estático y dinámico

Polimorfismo estático en Java El polimorfismo es un tipo de polimorfismo que recopila la información para llamar a un método en tiempo de compilación, mientras que el polimorfismo dinámico es un tipo de polimorfismo que recopila la información para llamar a un método en tiempo de ejecución.

Polimorfismo estático
Polimorfismo dinámico
Se relaciona con la sobrecarga de métodos. Se relaciona con la sobreescritura de métodos.
Los errores, si los hay, se resuelven en tiempo de compilación. Dado que el código no se ejecuta durante la compilación, el nombre es estático.

por ejemplo:

void sum (int a , int b);
void sum (float a, double b);
int sum (int a, int b); //compiler gives error.
Cuando una variable de referencia llama a un método sobrescrito, el método que se invoca viene determinado por el objeto al que apunta dicha variable. Esto solo se puede determinar en tiempo de ejecución, mientras el código se está ejecutando, por lo que el nombre es dinámico.

por ejemplo:

//reference of parent pointing to child object
 Doctor obj = new Surgeon();
// method of child called
obj.treatPatient();

Súper palabra clave en Java

¿Qué ocurre si el método treatPatient de la clase Surgeon quiere ejecutar la funcionalidad definida en la clase Doctor y luego realizar su propio comportamiento específico? En este caso, la palabra clave super Se puede utilizar para acceder a los métodos de la clase padre desde la clase hija. El método tratarPaciente de la clase Cirujano se podría escribir de la siguiente manera:

treatPatient(){
   super.treatPatient();
     //add code specific to Surgeon
}

La palabra clave super se puede utilizar para acceder a cualquier miembro de datos o método de la superclase dentro de la subclase. A continuación, aprenderemos sobre la palabra clave super, Herenciay polimorfismo en Java con programas de ejemplo.

Ejemplo: Para aprender Herencia, Polimorfismo y la palabra clave super

Paso 1) Copie el siguiente código en un editor.

public class Test{
     public static void main(String args[]){
        X x= new X();
        Y y = new Y();
        y.m2();
        //x.m1();
        //y.m1();
        //x = y;// parent pointing to object of child
        //x.m1() ;
        //y.a=10;
   }
}
class X{
   private int a;
   int b;
      public void m1(){
       System.out.println("This is method m1 of class X");
     }
}
class Y extends X{
      int c; // new instance variable of class Y
         public void m1(){
            // overridden method
            System.out.println("This is method m1 of class Y");
        }
       public void m2(){
           super.m1();
           System.out.println("This is method m2 of class Y");
      }
}

Paso 2) Guarda, compila y ejecuta el código. Observa el resultado.

Paso 3) Descomenta las líneas 6 a 9. Guarda, compila y ejecuta el código. Observa el resultado.

Paso 4) Descomenta la línea 10. Guarda y compila el código.

Paso 5) Error = ? Esto se debe a que la subclase no puede acceder a los miembros privados de la superclase.

Preguntas Frecuentes

Polimorfismo en Java es la capacidad de un objeto para adoptar múltiples formas. El mismo nombre de método puede ejecutar código diferente dependiendo de a qué objeto de subclase se haga referencia en tiempo de ejecución, lo cual constituye el comportamiento fundamental de la programación orientada a objetos (POO).

Java Admite polimorfismo en tiempo de compilación mediante sobrecarga de métodos y polimorfismo en tiempo de ejecución mediante anulación de métodos. La sobrecarga se resuelve en tiempo de compilación mediante enlace estático, mientras que la anulación se resuelve en tiempo de ejecución mediante enlace dinámico gestionado por la JVM.

El enlace estático vincula una llamada a un método con su definición en tiempo de compilación y se utiliza para la sobrecarga de métodos. El enlace dinámico vincula la llamada en tiempo de ejecución en función del tipo de objeto real y permite la anulación de métodos. Java.

La palabra clave `super` permite que una subclase llame al método sobrescrito o acceda a un miembro de datos de su clase padre. Esto permite que la clase hija reutilice la lógica de la clase padre y luego le añada un comportamiento especializado.

Los tutores de IA como ChatGPT y GitHub Copilot Chat pueden explicar el polimorfismo en Java Mediante analogías personalizadas, genere problemas de práctica, analice árboles de herencia y ponga a prueba a los alumnos sobre la vinculación estática frente a la dinámica para un dominio más rápido.

Sí. Los asistentes de refactorización impulsados ​​por IA como Cursor, Sourcegraph Cody e IntelliJ AI Assistant pueden detectar condicionales duplicados, proponer jerarquías de clases y reescribir código heredado. Java código para que Method Override reemplace las cadenas if-else repetidas.

Resumir este post con: