En este tutorial, aprenderemos sobre el polimorfismo, los diferentes tipos de polimorfismo y cómo implementarlos en Java con la ayuda de ejemplos.
El polimorfismo es un concepto importante de la programación orientada a objetos. Simplemente significa más de una forma. Es decir, la misma entidad (método u operador u objeto) se comporta de manera diferente en diferentes escenarios. Por ejemplo,
El
+
operador en Java se utiliza para realizar dos funciones específicas. Cuando se usa con números (enteros y números de coma flotante), realiza la suma.
int a = 5;
int b = 6;
int sum = a + b; // Output = 11
Y cuando usamos el
+
operador con cadenas, realiza la concatenación de cadenas. Por ejemplo,
String firstName = "abc ";
String lastName = "xyz";
name = firstName + lastName; // Output = abc xyz
Tipos de polimorfismo
En Java, el polimorfismo se puede dividir en dos tipos:
- Polimorfismo en tiempo de ejecución
- Polimorfismo en tiempo de compilación
Polimorfismo en tiempo de ejecución
En Java, el polimorfismo en tiempo de ejecución se puede lograr mediante la anulación del método.
Supongamos que se crea el mismo método en la superclase y sus subclases. En este caso, el método que se llamará depende del objeto utilizado para llamar al método. Por ejemplo,
Ejemplo 1: anulación del método
abstract class Animal {
public abstract void makeSound();
}
class Dog extends Animal {
@override
public void makeSound() {
System.out.println("Bark bark..");
}
}
class Cat extends Animal {
@override
public void makeSound() {
System.out.println("Meow meow..");
}
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.makeSound();
Cat c1 = new Cat();
c1.makeSound();
}
}
Cuando ejecutamos el programa, la salida será:
Ladrar ladrar… Miau miau...
Para saber cómo funciona la anulación de métodos, visite la anulación de métodos en Java .
En el ejemplo anterior, el método
makeSound()
tiene implementaciones diferentes en dos clases diferentes. Cuando ejecutamos el programa,- la expresión
d1.makeSound()
llamará al método de la clase Dog . Es porque d1 es un objeto de la clase Dog . - la expresión
c1.makeSound()
llamará al método de la clase Cat . Es porque c1 es un objeto de la clase cat.

El método que se llamará se determina durante la ejecución del programa. Por lo tanto, la anulación del método es un polimorfismo en tiempo de ejecución.
Polimorfismo en tiempo de compilación
El polimorfismo en tiempo de compilación se puede lograr mediante la sobrecarga de métodos y la sobrecarga de operadores en Java.
Método de sobrecarga
En una clase Java, podemos crear métodos con el mismo nombre si difieren en los parámetros. Por ejemplo,
void func() { ... }
void func(int a) { ... }
float func(double a) { ... }
float func(int a, float b) { ... }
Esto se conoce como sobrecarga de métodos en Java.
Tomemos un ejemplo funcional de sobrecarga de métodos.
Ejemplo 3: sobrecarga de métodos
class Demo {
public void displayPattern(){
for(int i = 0; i < 10; i++) {
System.out.print("*");
}
}
public void displayPattern(char symbol) {
for(int i = 0; i < 10; i++) {
System.out.print(symbol);
}
}
}
class Main {
public static void main(String[] args) {
Demo d1 = new Demo();
d1.displayPattern();
System.out.println("\n");
d1.displayPattern('#');
}
}
Cuando ejecutamos el programa, la salida será:
********** ##########
En el programa anterior, el
displayPattern()
método está sobrecargado.- Si llamamos al método sin pasar ningún argumento,
*
se crea un patrón de . - Si llamamos al método pasando un carácter como argumento, se crea un patrón de ese carácter.

Para obtener más información sobre la sobrecarga de métodos, visite Sobrecarga de métodos
Método Java Sobrecarga Vs Método Overriding
- En el caso de la anulación de métodos, los métodos deben estar dentro de diferentes clases. Mientras que, en el caso de sobrecarga de métodos, los métodos deben estar dentro de la misma clase.
- La anulación del método se realiza en tiempo de ejecución, mientras que la sobrecarga del método se realiza en tiempo de compilación.
Sobrecarga del operador
Algunos operadores en Java se comportan de manera diferente con diferentes operandos. Por ejemplo,
+
el operador está sobrecargado para realizar la suma numérica, así como la concatenación de cadenas, y- a los operadores les gusta
&
,|
y!
están sobrecargados para operaciones lógicas y bit a bit.
Veamos cómo se sobrecarga un operador en Java.
El
+
operador en Java se utiliza para realizar dos funciones específicas. Cuando se usa con números (enteros y números de coma flotante), realiza la suma. Por ejemplo,
int a = 5;
int b = 6;
int sum = a + b; // Output = 11
Y cuando usamos el
+
operador con cadenas, realiza la concatenación de cadenas. Por ejemplo,
String firstName = "abc ";
String lastName = "xyz";
name = firstName + lastName; // Output = abc xyz
En lenguajes como C ++, podemos definir operadores para que funcionen de manera diferente para diferentes operandos. Sin embargo, Java no admite la sobrecarga del operador definido por el usuario.
¿Por qué polimorfismo?
El polimorfismo nos permite crear código consistente. Por ejemplo,
Supongamos que necesitamos representar un círculo y un cuadrado. Para hacerlo, podemos crear una clase Polygon y heredar dos subclases Circle y square de ella. En este caso, tiene sentido crear un método que tenga el mismo nombre
render()
en ambas subclases en lugar de crear métodos con nombres diferentes.
En nuestro ejemplo de sobrecarga de métodos, hemos utilizado el mismo nombre de método
displayPattern()
para mostrar dos patrones diferentes para mantener la coherencia.
El
print()
método en Java también es un ejemplo de polimorfismo (sobrecarga de métodos). El mismo método se utiliza para imprimir los valores de diferentes tipos, como char
, int
, String
etc. También podemos utilizar el mismo método para imprimir múltiples valores de una vez.Variables polimórficas
En Java, las variables de objeto (variables de instancia) representan el comportamiento de las variables polimórficas. Esto se debe a que las variables de objeto de una clase pueden referirse tanto a objetos de su clase como a objetos de sus subclases. Por ejemplo,
class Animal {
public void displayInfo() {
System.out.println("I am an animal.");
}
}
class Dog extends Animal {
@override
public void displayInfo() {
System.out.println("I am a dog.");
}
}
class Main {
public static void main(String[] args) {
// declaration of object variable a1 of the Animal class
Animal a1;
// object creation of the Animal class
a1 = new Animal();
a1.displayInfo();
// object creation of the dog class
a1 = new Dog();
a1.displayInfo();
}
}
Cuando ejecutamos el programa, la salida será:
Soy un animal Soy un perro.
En el ejemplo anterior, hemos creado una variable de objeto a1 de la clase Animal . Aquí, a1 es una variable polimórfica.
Es porque,
- En la declaración
a1 = new Animal()
, a1 se refiere al objeto de la clase Animal . - En la declaración
a1 = new Dog()
, a1 se refiere al objeto de la clase Perro .
Este es un ejemplo de upcasting en Java. Visite upcasting y downcasting en Java para obtener más información.
0 Comentarios
Dejanos tu comentario para seguir mejorando!