Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Java

Dominando Polimorfismo em Java: Conceitos, Exemplos e Boas Práticas

Polimorfismo em Java

Explore o polimorfismo em Java através de explicações claras e exemplos práticos de código, e entenda como ele melhora flexibilidade e reutilização de código.

Polimorfismo — um pilar essencial da programação orientada a objetos — significa que uma única entidade pode assumir múltiplas formas.

Ou seja, a mesma entidade (método, operador ou objeto) pode realizar operações diferentes dependendo do contexto.


Exemplo: Polimorfismo em Java

class Poligono { // método para renderizar forma public void renderizar() { System.out.println("Renderizando Polígono..."); } } class Quadrado extends Poligono { // renderiza Quadrado public void renderizar() { System.out.println("Renderizando Quadrado..."); } } class Circulo extends Poligono { // renderiza círculo public void renderizar() { System.out.println("Renderizando Círculo..."); } } class Main { public static void main(String[] args) { // criar objeto de Quadrado Quadrado q1 = new Quadrado(); q1.renderizar(); // criar objeto de Circulo Circulo c1 = new Circulo(); c1.renderizar(); } }

Saída

Renderizando Quadrado... Renderizando Círculo...

No exemplo acima, criamos uma superclasse: Poligono e duas subclasses: Quadrado e Circulo. O método renderizar() é herdado por ambas subclasses, mas cada uma o sobrescreve para fornecer lógica de renderização específica da forma.

A conclusão principal é que renderizar() se comporta diferentemente dependendo do tipo real do objeto, que é a essência do polimorfismo.


Por Que Polimorfismo?

Polimorfismo permite que desenvolvedores escrevam código limpo e consistente. Em vez de definir métodos separados como renderizarQuadrado() ou renderizarCirculo(), um único método renderizar() se adapta a cada forma, reduzindo redundância e melhorando manutenibilidade.

Embora métodos separados funcionassem, eles rapidamente levam a duplicação de código e API fragmentada. Polimorfismo unifica comportamento sob um contrato comum, garantindo que qualquer nova forma possa ser integrada simplesmente sobrescrevendo renderizar().

Nota: O método print() também demonstra polimorfismo — pode imprimir char, int, String e mais sem requerer múltiplas sobrecargas.


Podemos alcançar polimorfismo em Java usando as seguintes técnicas:

  1. Sobrescrita de Método
  2. Sobrecarga de Método
  3. Sobrecarga de Operador

Sobrescrita de Método em Java

Quando uma subclasse define um método com a mesma assinatura de um método em sua superclasse, o método da subclasse sobrescreve o da superclasse. Isso permite que o mesmo nome de método realize operações diferentes baseadas no tipo do objeto em tempo de execução.

Exemplo 1: Polimorfismo usando sobrescrita de método

class Linguagem { public void exibirInfo() { System.out.println("Linguagem Inglesa Comum"); } } class Java extends Linguagem { @Override public void exibirInfo() { System.out.println("Linguagem de Programação Java"); } } class Main { public static void main(String[] args) { // criar objeto da classe Java Java j1 = new Java(); j1.exibirInfo(); // criar objeto da classe Linguagem Linguagem l1 = new Linguagem(); l1.exibirInfo(); } }

Saída:

Linguagem de Programação Java Linguagem Inglesa Comum

Aqui, Linguagem serve como classe base e Java como subclasse. O método exibirInfo() é definido em ambas classes, mas cada implementação entrega informação apropriada ao contexto.

O método que executa é determinado em tempo de execução, por isso este padrão é chamado de polimorfismo em tempo de execução.

Dominando Polimorfismo em Java: Conceitos, Exemplos e Boas Práticas

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


2. Sobrecarga de Método em Java

Sobrecarga de método permite que uma classe tenha múltiplos métodos com o mesmo nome mas listas de parâmetros diferentes. O compilador resolve qual método invocar baseado nos argumentos fornecidos.

void func() { ... } void func(int a) { ... } float func(double a) { ... } float func(int a, float b) { ... }

Esta técnica permite que a mesma operação lógica aceite entradas variadas.

Exemplo 3: Polimorfismo usando sobrecarga de método

class Padrao { // método sem parâmetro public void exibir() { for (int i = 0; i < 10; i++) { System.out.print("*"); } } // método com parâmetro único public void exibir(char simbolo) { for (int i = 0; i < 10; i++) { System.out.print(simbolo); } } } class Main { public static void main(String[] args) { Padrao d1 = new Padrao(); // chamar método sem argumento d1.exibir(); System.out.println("\n"); // chamar método com argumento único d1.exibir('#'); } }

Saída:

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

Neste exemplo, a classe Padrao contém dois métodos exibir() sobrecarregados. A versão sem parâmetros imprime dez asteriscos, enquanto a que aceita char imprime dez cópias do símbolo fornecido.

Como o compilador seleciona o método em tempo de compilação, esta forma de polimorfismo é frequentemente chamada de polimorfismo em tempo de compilação.

Nota: O método chamado é determinado pelo compilador. Por isso, também é conhecido como polimorfismo em tempo de compilação.


3. Sobrecarga de Operador em Java

Operadores do Java podem exibir comportamentos diferentes baseados nos tipos de operandos. Por exemplo, o operador + realiza adição numérica quando usado com números e concatenação de strings quando usado com strings.

Abaixo estão snippets ilustrativos mostrando como + se adapta a seus operandos.

1. Com números:

int a = 5; int b = 6; // + com números int soma = a + b; // Saída = 11

2. Com strings:

String primeiro = "Java "; String segundo = "Programação"; // + com strings String nome = primeiro + segundo; // Saída = Java Programação

Assim, + é sobrecarregado em Java para realizar tanto adição quanto concatenação.

Nota: Embora linguagens como C++ permitam sobrecarga de operador definida pelo usuário, Java restringe sobrecarga de operador a operadores built-in apenas.


Variáveis Polimórficas

Uma variável é considerada polimórfica quando pode referenciar objetos de diferentes tipos durante a execução do programa. Em Java, referências de objeto permitem este comportamento, permitindo que uma referência de tipo base aponte para instâncias de subclasses.

Exemplo: Variáveis Polimórficas

class LinguagemProgramacao { public void exibir() { System.out.println("Sou Linguagem de Programação."); } } class Java extends LinguagemProgramacao { @Override public void exibir() { System.out.println("Sou Linguagem de Programação Orientada a Objetos."); } } class Main { public static void main(String[] args) { // declarar variável de objeto LinguagemProgramacao lp; // criar objeto de LinguagemProgramacao lp = new LinguagemProgramacao(); lp.exibir(); // criar objeto da classe Java lp = new Java(); lp.exibir(); } }

Saída:

Sou Linguagem de Programação. Sou Linguagem de Programação Orientada a Objetos.

Nesta ilustração, a referência lp é declarada com o tipo base LinguagemProgramacao mas é atribuída objetos tanto da classe base quanto de sua subclasse. Isso demonstra upcasting e polimorfismo em tempo de execução.

Java

  1. Dominando Operadores Java: Tipos, Sintaxe e Exemplos Práticos
  2. Dominando Interfaces em Java: Conceitos, Implementação e Boas Práticas
  3. Dominando Try-With-Resources em Java: Gerenciamento Automático de Recursos Explicado
  4. Anotações em Java Explicadas: Tipos, Posicionamento e Exemplos Práticos
  5. Tipos de Anotação em Java: Guia Completo de Predefinidas, Customizadas e Meta-Anotações
  6. Método Java String length(): Como Obter o Tamanho de uma String (Exemplo)
  7. Dominando Java String.indexOf(): Localizando Substrings e Exemplos Práticos
  8. Entendendo Java String.charAt(): Sintaxe, Tipo de Retorno, Exceções e Exemplo Prático
  9. Dominando Java String.endsWith(): Como Verificar Sufixos de String com Exemplos
  10. Dominando Substituição de Strings em Java: replace(), replaceAll() e replaceFirst() Explicados