Java
Tutorial Java: Polimorfismo
Java polimorfismo: técnicas y ejemplos. Domina las técnicas de polimorfismo en Java con ejemplos prácticos y detallados.
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.
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.
Gestión de errores y excepciones
Datos primitivos
Streams: min max
Clases abstractas
Polimorfismo de tiempo de ejecución
Streams: map()
Interfaz funcional Predicate
Llamada y sobrecarga de funciones
ArrayList
Representación de Fecha
Operadores lógicos
OOP en Java
Estructuras de iteración
Objetos
Streams: sorted()
Polimorfismo de tiempo de compilación
Streams: filter()
Métodos referenciados
Métodos de la clase String
Streams: flatMap()
Operadores aritméticos
Streams: match
Interfaz funcional Consumer
Operaciones de Streams
Clases y objetos
API java.nio 2
CRUD en Java de modelo Customer sobre un ArrayList
Interfaces
Streams: distinct()
Representación de Hora
Tipos de variables
Herencia básica
Datos de referencia
Creación de Streams
Interfaz funcional Function
Métodos básicos de la clase String
HashMap
Funciones lambda
Uso de API Optional
Streams: count()
Streams: forEach()
Métodos avanzados de la clase String
Excepciones
Herencia avanzada
Estructuras de selección
Uso de interfaces
Sobrecarga de métodos
API Optional
Tipos de datos
Streams: reduce()
HashSet
Uso de variables
Objeto Scanner
Interfaces funcionales
Configuración de entorno
Clases
Uso de Scanner
Interfaz funcional Supplier
CRUD en Java de modelo Customer sobre un HashMap
Streams: collect()
Instalación
Funciones
Encapsulación
Estructuras de control
Herencia de clases
Funciones y encapsulamiento
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
Sintaxis
Tipos De Datos
Sintaxis
Variables
Sintaxis
Operadores
Sintaxis
Estructuras De Control
Sintaxis
Funciones
Sintaxis
Funciones Cierre (Closure)
Sintaxis
Funciones Flecha
Programación Funcional
Filtrado Con Filter() Y Find()
Programación Funcional
Transformación Con Map()
Programación Funcional
Reducción Con Reduce()
Programación Funcional
Clases Y Objetos
Programación Orientada A Objetos
Excepciones
Programación Orientada A Objetos
Encapsulación
Programación Orientada A Objetos
Herencia
Programación Orientada A Objetos
Polimorfismo
Programación Orientada A Objetos
Array
Estructuras De Datos
Conjuntos Con Set
Estructuras De Datos
Mapas Con Map
Estructuras De Datos
Manipulación Dom
Dom
Selección De Elementos Dom
Dom
Modificación De Elementos Dom
Dom
Eventos Del Dom
Dom
Callbacks
Programación Asíncrona
Promises
Programación Asíncrona
Async / Await
Programación Asíncrona
Instalación De Java
Introducción Y Entorno
Configuración De Entorno 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
Funciones Lambda
Programación Funcional
Interfaz Funcional Consumer
Programación Funcional
Interfaz Funcional Predicate
Programación Funcional
Interfaz Funcional Function
Programación Funcional
Interfaz Funcional Supplier
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: Flatmap()
Programación Funcional
Operaciones Intermedias Con Streams: Sorted()
Programación Funcional
Operaciones Intermedias Con Streams: Distinct()
Programación Funcional
Operaciones Finales Con Streams: Reduce()
Programación Funcional
Operaciones Finales Con Streams: Collect()
Programación Funcional
Operaciones Finales Con Streams: Foreach()
Programación Funcional
Operaciones Finales Con Streams: Count()
Programación Funcional
Operaciones Finales Con Streams: Min Max
Programación Funcional
Operaciones Finales Con Streams: Match
Programación Funcional
Api Optional
Programación Funcional
Listas
Framework Collections
Conjuntos
Framework Collections
Mapas
Framework Collections
Api Java.nio 2
Entrada Y Salida (Io)
Api Java.time
Api Java.time
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
- Entender el concepto de Polimorfismo en la Programación Orientada a Objetos (POO).
- Aprender a implementar el polimorfismo de tiempo de compilación mediante la sobrecarga de métodos en Java.
- Aprender a implementar el polimorfismo de tiempo de ejecución mediante la sobrescritura de métodos en Java.
- Comprender cómo y por qué se utiliza el polimorfismo en el desarrollo de software.
- Aprender a identificar situaciones en las que el polimorfismo puede hacer que el código sea más eficiente y flexible.