Polimorfismo de Java (con ejemplos)

En este tutorial, aprenderemos sobre el polimorfismo de Java y su implementación 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, una misma entidad (método u operador u objeto) puede realizar diferentes operaciones en diferentes escenarios.

Ejemplo: polimorfismo de Java

 class Polygon ( // method to render a shape public void render() ( System.out.println("Rendering Polygon… "); ) ) class Square extends Polygon ( // renders Square public void render() ( System.out.println("Rendering Square… "); ) ) class Circle extends Polygon ( // renders circle public void render() ( System.out.println("Rendering Circle… "); ) ) class Main ( public static void main(String() args) ( // create an object of Square Square s1 = new Square(); s1.render(); // create an object of Circle Circle c1 = new Circle(); c1.render(); ) )

Salida

 Representando cuadrado … Representando círculo … 

En el ejemplo anterior, hemos creado una superclase: Polígono y dos subclases: Cuadrado y Círculo. Note el uso del render()método.

El objetivo principal del render()método es renderizar la forma. Sin embargo, el proceso de renderizado de un cuadrado es diferente al proceso de renderizado de un círculo.

Por lo tanto, el render()método se comporta de manera diferente en diferentes clases. O podemos decir que render()es polimórfico.

¿Por qué polimorfismo?

El polimorfismo nos permite crear código coherente. En el ejemplo anterior, también podemos crear diferentes métodos: renderSquare()y renderCircle()renderizar Square y Circle, respectivamente.

Esto funcionará perfectamente. Sin embargo, para cada forma, necesitamos crear diferentes métodos. Hará que nuestro código sea inconsistente.

Para resolver esto, el polimorfismo en Java nos permite crear un método único render()que se comportará de manera diferente para diferentes formas.

Nota : El print()método también es un ejemplo de polimorfismo. Se utiliza para imprimir los valores de diferentes tipos, como char, int, string, etc.

Podemos lograr el polimorfismo en Java de las siguientes formas:

  1. Anulación de método
  2. Sobrecarga de métodos
  3. Sobrecarga del operador

Anulación del método Java

Durante la herencia en Java, si el mismo método está presente tanto en la superclase como en la subclase. Entonces, el método de la subclase anula el mismo método de la superclase. A esto se le llama anulación de método.

En este caso, el mismo método realizará una operación en la superclase y otra operación en la subclase. Por ejemplo,

Ejemplo 1: polimorfismo con anulación de método

 class Language ( public void displayInfo() ( System.out.println("Common English Language"); ) ) class Java extends Language ( @Override public void displayInfo() ( System.out.println("Java Programming Language"); ) ) class Main ( public static void main(String() args) ( // create an object of Java class Java j1 = new Java(); j1.displayInfo(); // create an object of Language class Language l1 = new Language(); l1.displayInfo(); ) )

Salida :

 Lenguaje de programación Java Lenguaje común en inglés

En el ejemplo anterior, hemos creado una superclase llamada Language y una subclase llamada Java. Aquí, el método displayInfo()está presente tanto en Language como en Java.

El uso de displayInfo()es imprimir la información. Sin embargo, está imprimiendo información diferente en Language y Java.

Según el objeto utilizado para llamar al método, se imprime la información correspondiente.

Trabajo del polimorfismo de Java

Nota : El método que se llama se determina durante la ejecución del programa. Por tanto, la invalidación de métodos es un polimorfismo en tiempo de ejecución .

2. Sobrecarga del método Java

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. Aquí, el mismo método realizará diferentes operaciones según el parámetro.

Ejemplo 3: polimorfismo con sobrecarga de métodos

 class Pattern ( // method without parameter public void display() ( for (int i = 0; i < 10; i++) ( System.out.print("*"); ) ) // method with single parameter public void display(char symbol) ( for (int i = 0; i < 10; i++) ( System.out.print(symbol); ) ) ) class Main ( public static void main(String() args) ( Pattern d1 = new Pattern(); // call method without any argument d1.display(); System.out.println(""); // call method with a single argument d1.display('#'); ) )

Salida :

 ********** ##########

En el ejemplo anterior, hemos creado una clase llamada Patrón. La clase contiene un método llamado display()que está sobrecargado.

 // method with no arguments display() (… ) // method with a single char type argument display(char symbol) (… )

Aquí, la función principal de display()es imprimir el patrón. Sin embargo, según los argumentos pasados, el método realiza diferentes operaciones:

  • imprime un patrón de *, si no se pasa ningún argumento o
  • imprime el patrón del parámetro, si charse pasa un solo tipo de argumento.

Nota : El compilador determina el método que se llama. Por lo tanto, también se conoce como polimorfismo en tiempo de compilación.

3. Sobrecarga del operador de Java

Algunos operadores en Java se comportan de manera diferente con diferentes operandos. Por ejemplo,

  • + operator is overloaded to perform numeric addition as well as string concatenation, and
  • operators like &, |, and ! are overloaded for logical and bitwise operations.

Let's see how we can achieve polymorphism using operator overloading.

The + operator is used to add two entities. However, in Java, the + operator performs two operations.

1. When + is used with numbers (integers and floating-point numbers), it performs mathematical addition. For example,

 int a = 5; int b = 6; // + with numbers int sum = a + b; // Output = 11

2. When we use the + operator with strings, it will perform string concatenation (join two strings). For example,

 String first = "Java "; String second = "Programming"; // + with strings name = first + second; // Output = Java Programming

Here, we can see that the + operator is overloaded in Java to perform two operations: addition and concatenation.

Note: In languages like C++, we can define operators to work differently for different operands. However, Java doesn't support user-defined operator overloading.

Polymorphic Variables

A variable is called polymorphic if it refers to different values under different conditions.

Object variables (instance variables) represent the behavior of polymorphic variables in Java. It is because object variables of a class can refer to objects of its class as well as objects of its subclasses.

Example: Polymorphic Variables

 class ProgrammingLanguage ( public void display() ( System.out.println("I am Programming Language."); ) ) class Java extends ProgrammingLanguage ( @Override public void display() ( System.out.println("I am Object-Oriented Programming Language."); ) ) class Main ( public static void main(String() args) ( // declare an object variable ProgrammingLanguage pl; // create object of ProgrammingLanguage pl = new ProgrammingLanguage(); pl.display(); // create object of Java class pl = new Java(); pl.display(); ) )

Output:

 I am Programming Language. I am Object-Oriented Programming Language.

En el ejemplo anterior, hemos creado una variable de objeto pl de la clase ProgrammingLanguage. Aquí, pl es una variable polimórfica. Esto es porque,

  • En declaración pl = new ProgrammingLanguage(), pl se refiere al objeto de la clase ProgrammingLanguage.
  • Y, en la declaración pl = new Java(), pl se refiere al objeto de la clase Java.

Este es un ejemplo de upcasting en Java.

Articulos interesantes...