Perfilado de sección

  • Uno de los principales objetivos de la Programación Orientada a Objetos (POO) es desarrollar software flexible, reutilizable y fácil de mantener. Para alcanzar este propósito, la POO se fundamenta en cuatro pilares: encapsulamiento, abstracción, herencia y polimorfismo. Estos principios permiten modelar problemas del mundo real mediante clases y objetos que interactúan entre sí de manera organizada.

    El polimorfismo representa uno de los conceptos más poderosos de la POO, ya que permite que un mismo mensaje o llamada a un método produzca comportamientos diferentes dependiendo del objeto que lo reciba. Gracias a este principio, es posible escribir programas más generales y reutilizables, disminuyendo la duplicación de código y facilitando la incorporación de nuevos tipos de objetos sin modificar la lógica principal de la aplicación.

    En Java, el polimorfismo se implementa principalmente mediante la herencia, la sobreescritura de métodos (Override) y las interfaces, permitiendo que un objeto de una subclase sea tratado como un objeto de su superclase o de una interfaz.

     

    ¿Qué es el Polimorfismo?

    La palabra polimorfismo proviene del griego:

    Poly = muchos.

    Morphé = formas.

    Literalmente significa “muchas formas”.

    En Programación Orientada a Objetos, el polimorfismo es la capacidad que tienen diferentes objetos de responder de manera distinta al mismo mensaje o método.

    En otras palabras, un mismo método puede ejecutarse de forma diferente dependiendo del tipo de objeto que lo invoque.

     

    Ejemplo cotidiano

    Imagine una universidad donde diferentes personas reciben la orden:

    “Realice su trabajo”.

    Cada una responde de forma distinta.

    El docente dicta clase.

    El coordinador supervisa procesos académicos.

    El secretario registra información.

    El bibliotecario organiza los libros.

    Todos reciben exactamente el mismo mensaje, pero cada uno ejecuta una acción diferente.

    Ese comportamiento representa el principio del polimorfismo.


    Fundamentos del Polimorfismo

    El polimorfismo se apoya en tres elementos fundamentales:

    1. Herencia

    Permite que una clase derive características de otra.

    Sin herencia resulta mucho más difícil implementar polimorfismo mediante clases.

    Ejemplo:

    Empleado

    ├── Docente
    ├── Coordinador
    └── Administrativo

    Todas las clases heredan de Empleado.

     

    2. Sobreescritura de métodos (Method Override)

    Consiste en redefinir un método heredado para adaptarlo a las necesidades de cada subclase.

    Cada objeto ejecutará su propia implementación.

     

    3. Enlace dinámico (Dynamic Binding)

    Java determina en tiempo de ejecución cuál versión del método debe ejecutarse.

    Esto significa que la decisión no depende del tipo de referencia sino del tipo real del objeto.

     

    Tipos de Polimorfismo

    Polimorfismo de compilación

    También llamado:

    Sobrecarga de métodos (Overloading).

    Se produce cuando existen varios métodos con el mismo nombre pero diferentes parámetros.

    Ejemplo:

    sumar(int a, int b)

    sumar(double a, double b)

    sumar(int a, int b, int c)

    La decisión ocurre durante la compilación.

     

    Polimorfismo en tiempo de ejecución

    También conocido como:

    Polimorfismo dinámico.

    Se logra mediante:

    Herencia.

    Sobreescritura.

    Referencias de la superclase.

    Es el tipo de polimorfismo más utilizado en Java.

     

     

     

    Ejemplo Aplicado 1

    Sistema de Gestión de Empleados

    Una universidad desarrolla un sistema de nómina.

    Todos los empleados poseen un método denominado:

    calcularSalario()

    Sin embargo:

    Un docente recibe salario según horas de clase.

    Un coordinador recibe salario fijo más bonificación.

    Un administrativo recibe salario mensual.

    Cada uno calcula el salario de forma diferente.

    Clase base

    public class Empleado {

        public double calcularSalario() {
            return 0;
        }
    }

    Clase Docente

    public class Docente extends Empleado {

        private int horas;
        private double valorHora;

        public Docente(int horas, double valorHora) {
            this.horas = horas;
            this.valorHora = valorHora;
        }

        @Override
        public double calcularSalario() {
            return horas * valorHora;
        }
    }

     

    Clase Coordinador

    public class Coordinador extends Empleado {

        @Override
        public double calcularSalario() {
            return 4500000 + 800000;
        }
    }

    Programa principal

    public class Principal {

        public static void main(String[] args) {

            Empleado empleado1 = new Docente(160, 25000);
            Empleado empleado2 = new Coordinador();

            System.out.println(empleado1.calcularSalario());
            System.out.println(empleado2.calcularSalario());
        }
    }

    Análisis

    Observe que ambas variables son de tipo Empleado, pero cada una ejecuta un método diferente.

    Java identifica automáticamente el tipo real del objeto.

    Este comportamiento constituye el polimorfismo dinámico