Polimorfismo Java (com exemplos)

Neste tutorial, aprenderemos sobre o polimorfismo Java e sua implementação com a ajuda de exemplos.

O polimorfismo é um conceito importante de programação orientada a objetos. Simplesmente significa mais de um formulário.

Ou seja, a mesma entidade (método ou operador ou objeto) pode realizar diferentes operações em diferentes cenários.

Exemplo: polimorfismo 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(); ) )

Resultado

 Rendering Square … Rendering Circle … 

No exemplo acima, criamos uma superclasse: Polygon e duas subclasses: Square e Circle. Observe o uso do render()método.

O objetivo principal do render()método é renderizar a forma. No entanto, o processo de renderizar um quadrado é diferente do processo de renderizar um círculo.

Portanto, o render()método se comporta de maneira diferente em classes diferentes. Ou, podemos dizer que render()é polimórfico.

Por que polimorfismo?

O polimorfismo nos permite criar um código consistente. No exemplo anterior, também podemos criar métodos diferentes: renderSquare()e renderCircle()para renderizar Square e Circle, respectivamente.

Isso funcionará perfeitamente. No entanto, para cada forma, precisamos criar métodos diferentes. Isso tornará nosso código inconsistente.

Para resolver isso, o polimorfismo em Java nos permite criar um único método render()que se comportará de maneira diferente para diferentes formas.

Observação : o print()método também é um exemplo de polimorfismo. Ele é usado para imprimir valores de diferentes tipos, como char, int, string, etc.

Podemos obter polimorfismo em Java usando as seguintes maneiras:

  1. Substituição de método
  2. Sobrecarga de método
  3. Sobrecarga do operador

Substituição de método Java

Durante a herança em Java, se o mesmo método estiver presente na superclasse e na subclasse. Em seguida, o método na subclasse substitui o mesmo método na superclasse. Isso é chamado de substituição de método.

Nesse caso, o mesmo método executará uma operação na superclasse e outra operação na subclasse. Por exemplo,

Exemplo 1: polimorfismo usando substituição 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(); ) )

Produto :

 Java Programming Language Common English Language

No exemplo acima, criamos uma superclasse chamada Language e uma subclasse chamada Java. Aqui, o método displayInfo()está presente tanto em linguagem quanto em Java.

O uso de displayInfo()é para imprimir as informações. No entanto, ele está imprimindo informações diferentes em linguagem e Java.

Com base no objeto usado para chamar o método, as informações correspondentes são impressas.

Trabalho do polimorfismo Java

Nota : O método chamado é determinado durante a execução do programa. Portanto, a substituição de método é um polimorfismo de tempo de execução .

2. Sobrecarga do método Java

Em uma classe Java, podemos criar métodos com o mesmo nome se eles diferirem em parâmetros. Por exemplo,

 void func() (… ) void func(int a) (… ) float func(double a) (… ) float func(int a, float b) (… )

Isso é conhecido como sobrecarga de método em Java. Aqui, o mesmo método executará diferentes operações com base no parâmetro.

Exemplo 3: Polimorfismo usando sobrecarga de método

 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('#'); ) )

Produto :

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

No exemplo acima, criamos uma classe chamada Pattern. A classe contém um método denominado display()que está sobrecarregado.

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

Aqui, a principal função do display()é imprimir o padrão. No entanto, com base nos argumentos passados, o método está realizando operações diferentes:

  • imprime um padrão de *, se nenhum argumento for passado ou
  • imprime o padrão do parâmetro, se um único charargumento de tipo for passado.

Observação : o método chamado é determinado pelo compilador. Portanto, também é conhecido como polimorfismo em tempo de compilação.

3. Sobrecarga do operador Java

Alguns operadores em Java se comportam de maneira diferente com operandos diferentes. Por exemplo,

  • + 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.

No exemplo acima, criamos uma variável de objeto pl da classe ProgrammingLanguage. Aqui, pl é uma variável polimórfica. Isto é porque,

  • Na instrução pl = new ProgrammingLanguage(), pl refere-se ao objeto da classe ProgrammingLanguage.
  • E, na declaração pl = new Java(), pl refere-se ao objeto da classe Java.

Este é um exemplo de upcasting em Java.

Artigos interessantes...