Java

Tutorial Java: Polimorfismo

Java polimorfismo: técnicas y ejemplos. Domina las técnicas de polimorfismo en Java con ejemplos prácticos y detallados.

Aprende Java GRATIS y certifícate

El Polimorfismo es uno de los cuatro pilares fundamentales de la Programación Orientada a Objetos (POO), junto con la Encapsulación, la Herencia y la Abstracción. La palabra "polimorfismo" viene del griego "polys", que significa "muchos", y "morphe", que significa "forma". Por lo tanto, el polimorfismo se puede entender como la capacidad de tomar muchas formas.

En términos de programación, el polimorfismo se refiere a la capacidad de un objeto de comportarse de diferentes formas dependiendo del contexto. En Java, esto se logra principalmente a través de la herencia y las interfaces.

Hay dos tipos de polimorfismo en Java: polimorfismo de tiempo de compilación y polimorfismo de tiempo de ejecución. El polimorfismo de tiempo de compilación se logra a través de la sobrecarga de métodos, mientras que el polimorfismo de tiempo de ejecución se logra a través de la sobrescritura de métodos.

Polimorfismo de tiempo de compilación

El polimorfismo de tiempo de compilación, también conocido como sobrecarga de métodos, permite que dos o más métodos en una misma clase tengan el mismo nombre pero parámetros diferentes. La clave aquí es que el compilador de Java decide qué método llamar en tiempo de compilación, basándose en los argumentos proporcionados.

Un ejemplo en código de esto sería:

class Polimorfismo {
    
    void demo (int a) {
        System.out.println ("a: " + a);
    }
    
    void demo (int a, int b) {
        System.out.println ("a y b: " + a + "," + b);
    }
    
    double demo(double a) {
        System.out.println("double a: " + a);
        return a*a;
    }
}

class MetodoPrincipal {
    public static void main(String[] args) {
        Polimorfismo Obj = new Polimorfismo();
        double resultado;
        Obj.demo(10);
        Obj.demo(10, 20);
        resultado = Obj.demo(5.5);
        System.out.println("O/P : " + resultado);
    }
}

En el código anterior, la clase Polimorfismo tiene tres métodos llamados demo(). Pero cada método acepta parámetros diferentes. Cuando se llama a demo(10), se ejecuta el primer método. Cuando se llama a demo(10, 20), se ejecuta el segundo método. Y cuando se llama a demo(5.5), se ejecuta el tercer método.

Polimorfismo de tiempo de ejecución

El polimorfismo de tiempo de ejecución, también conocido como sobrescritura de métodos, se produce cuando una subclase tiene un método que ya existe en su superclase. La sobrescritura de métodos permite que la subclase proporcione su propia implementación para el método existente. La decisión de qué método ejecutar se toma durante la ejecución, no durante la compilación.

Un ejemplo en código de esto sería:

class Animal {
    void comer() {
        System.out.println("El animal come");
    }
}

class Perro extends Animal {
    void comer() {
        System.out.println("El perro come");
    }
}

class TestPolimorfismo {
    public static void main(String[] args) {
        Animal a = new Animal();   // Animal referencia y objeto
        Animal b = new Perro();   // Animal referencia pero objeto Perro
        
        a.comer();   // corre el método en Animal class
        b.comer();   // corre el método en Perro class
    }
}

En este código, la clase Animal tiene un método llamado comer(). La clase Perro, que hereda de Animal, también tiene un método llamado comer(). Cuando se llama al método comer() en el objeto a, se ejecuta el método en la clase Animal. Pero cuando se llama al método comer() en el objeto b, se ejecuta el método en la clase Perro. Esto es porque b es un objeto de la clase Perro, aunque se le hace referencia como Animal.

¿Por qué es útil el polimorfismo?

El polimorfismo es útil por varias razones. Permite que el código sea más reutilizable y más fácil de entender y mantener. También facilita la implementación de código que es agnóstico al tipo de los objetos con los que trabaja.

Por ejemplo, si se tiene un arreglo de objetos Animal (donde Animal podría ser una superclase para clases como Perro, Gato, Pájaro, etc.), se podría tener un ciclo que recorra el arreglo y llame al método hablar() en cada objeto Animal. Esto haría que cada animal haga su propio sonido, a pesar de que el código del ciclo no tiene que saber específicamente qué tipo de Animal está manejando.

Aprende Java GRATIS online

Ejercicios de esta lección Polimorfismo

Evalúa tus conocimientos de esta lección Polimorfismo con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Clases abstractas

Test

Streams: reduce()

Test

Streams: flatMap()

Test

Llamada y sobrecarga de funciones

Puzzle

Métodos referenciados

Test

Métodos de la clase String

Código

Representación de Fecha

Puzzle

Operadores lógicos

Test

Tipos de datos

Código

Estructuras de iteración

Puzzle

Streams: forEach()

Test

Objetos

Puzzle

Funciones lambda

Test

Uso de Scanner

Puzzle

CRUD en Java de modelo Customer sobre un ArrayList

Proyecto

Tipos de variables

Puzzle

Streams: collect()

Puzzle

Operadores aritméticos

Puzzle

Interfaz funcional Consumer

Test

API java.nio 2

Puzzle

API Optional

Test

Interfaz funcional Function

Test

Encapsulación

Test

Interfaces

Código

Uso de API Optional

Puzzle

Representación de Hora

Test

Herencia básica

Test

Clases y objetos

Código

Interfaz funcional Supplier

Puzzle

HashMap

Puzzle

Sobrecarga de métodos

Test

Polimorfismo de tiempo de ejecución

Puzzle

OOP en Java

Proyecto

Creación de Streams

Test

Streams: min max

Puzzle

Métodos avanzados de la clase String

Puzzle

Polimorfismo de tiempo de compilación

Test

Excepciones

Puzzle

Herencia avanzada

Puzzle

Estructuras de selección

Test

Uso de interfaces

Test

HashSet

Test

Objeto Scanner

Test

Streams: filter()

Puzzle

Operaciones de Streams

Puzzle

Interfaz funcional Predicate

Puzzle

Streams: sorted()

Test

Configuración de entorno

Test

CRUD en Java de modelo Customer sobre un HashMap

Proyecto

Uso de variables

Test

Clases

Test

Streams: distinct()

Puzzle

Streams: count()

Test

ArrayList

Test

Datos de referencia

Test

Interfaces funcionales

Puzzle

Métodos básicos de la clase String

Test

Instalación

Test

Funciones

Código

Estructuras de control

Código

Herencia de clases

Código

Streams: map()

Puzzle

Funciones y encapsulamiento

Test

Streams: match

Test

Gestión de errores y excepciones

Código

Datos primitivos

Puzzle

Todas las lecciones de Java

Accede a todas las lecciones de Java y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Javascript

JavaScript

Sintaxis

Tipos De Datos

JavaScript

Sintaxis

Variables

JavaScript

Sintaxis

Operadores

JavaScript

Sintaxis

Estructuras De Control

JavaScript

Sintaxis

Funciones

JavaScript

Sintaxis

Funciones Cierre (Closure)

JavaScript

Sintaxis

Funciones Flecha

JavaScript

Programación Funcional

Filtrado Con Filter() Y Find()

JavaScript

Programación Funcional

Transformación Con Map()

JavaScript

Programación Funcional

Reducción Con Reduce()

JavaScript

Programación Funcional

Clases Y Objetos

JavaScript

Programación Orientada A Objetos

Excepciones

JavaScript

Programación Orientada A Objetos

Encapsulación

JavaScript

Programación Orientada A Objetos

Herencia

JavaScript

Programación Orientada A Objetos

Polimorfismo

JavaScript

Programación Orientada A Objetos

Array

JavaScript

Estructuras De Datos

Conjuntos Con Set

JavaScript

Estructuras De Datos

Mapas Con Map

JavaScript

Estructuras De Datos

Manipulación Dom

JavaScript

Dom

Selección De Elementos Dom

JavaScript

Dom

Modificación De Elementos Dom

JavaScript

Dom

Eventos Del Dom

JavaScript

Dom

Callbacks

JavaScript

Programación Asíncrona

Promises

JavaScript

Programación Asíncrona

Async / Await

JavaScript

Programación Asíncrona

Instalación De Java

Introducción Y Entorno

Configuración De Entorno Java

Introducción Y Entorno

Ecosistema Jakarta Ee De Java

Introducción Y Entorno

Tipos De Datos

Sintaxis

Variables

Sintaxis

Operadores

Sintaxis

Estructuras De Control

Sintaxis

Funciones

Sintaxis

Excepciones

Programación Orientada A Objetos

Clases Y Objetos

Programación Orientada A Objetos

Encapsulación

Programación Orientada A Objetos

Herencia

Programación Orientada A Objetos

Clases Abstractas

Programación Orientada A Objetos

Interfaces

Programación Orientada A Objetos

Sobrecarga De Métodos

Programación Orientada A Objetos

Polimorfismo

Programación Orientada A Objetos

La Clase Scanner

Programación Orientada A Objetos

Métodos De La Clase String

Programación Orientada A Objetos

Listas

Framework Collections

Conjuntos

Framework Collections

Mapas

Framework Collections

Funciones Lambda

Programación Funcional

Interfaz Funcional Consumer

Programación Funcional

Interfaz Funcional Predicate

Programación Funcional

Interfaz Funcional Supplier

Programación Funcional

Interfaz Funcional Function

Programación Funcional

Métodos Referenciados

Programación Funcional

Creación De Streams

Programación Funcional

Operaciones Intermedias Con Streams: Map()

Programación Funcional

Operaciones Intermedias Con Streams: Filter()

Programación Funcional

Operaciones Intermedias Con Streams: Distinct()

Programación Funcional

Operaciones Finales Con Streams: Collect()

Programación Funcional

Operaciones Finales Con Streams: Min Max

Programación Funcional

Operaciones Intermedias Con Streams: Flatmap()

Programación Funcional

Operaciones Intermedias Con Streams: Sorted()

Programación Funcional

Operaciones Finales Con Streams: Reduce()

Programación Funcional

Operaciones Finales Con Streams: Foreach()

Programación Funcional

Operaciones Finales Con Streams: Count()

Programación Funcional

Operaciones Finales Con Streams: Match

Programación Funcional

Api Optional

Programación Funcional

Api Java.nio 2

Entrada Y Salida (Io)

Api Java.time

Api Java.time

Accede GRATIS a Java y certifícate

Certificados de superación de Java

Supera todos los ejercicios de programación del curso de Java y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.

En esta lección

Objetivos de aprendizaje de esta lección

  1. Entender el concepto de Polimorfismo en la Programación Orientada a Objetos (POO).
  2. Aprender a implementar el polimorfismo de tiempo de compilación mediante la sobrecarga de métodos en Java.
  3. Aprender a implementar el polimorfismo de tiempo de ejecución mediante la sobrescritura de métodos en Java.
  4. Comprender cómo y por qué se utiliza el polimorfismo en el desarrollo de software.
  5. Aprender a identificar situaciones en las que el polimorfismo puede hacer que el código sea más eficiente y flexible.