Polimorfismo em Java: Conceitos, Tipos, Características e Exemplos
Publicados: 2022-04-18Javascript é uma das linguagens de Programação Orientada a Objetos mais populares e amplamente utilizadas, juntamente com C#, PHP, Python, C++, etc. Ele permite que os usuários exibam e abordem conceitos da vida real por meio de programação, pois tudo é representado como um objeto. Os recursos do Java como linguagem de programação oferecem vários caminhos para simplificar o desenvolvimento de software, tornando os códigos mais dinâmicos e facilitando a manutenção.
Neste artigo, exploraremos Java como uma linguagem de programação orientada a objetos e entenderemos os conceitos de herança, abstração, polimorfismo e encapsulamento de dados. Também veremos os tipos de polimorfismo em Java, suas vantagens e desvantagens.
Visão geral da programação orientada a objetos
As linguagens de programação orientada a objetos (OOP) referem-se às linguagens de computador que usam o conceito de 'objetos' em tempo real na codificação. Ele visa implementar entidades mundanas como herança, polimorfismo, loops, abstração de dados, etc., por meio de programação.
Existem alguns conceitos básicos de Programação Orientada a Objetos com os quais os programadores precisam se familiarizar. Esses termos conceituais são necessários para aprender sobre recursos especiais e exclusivos da POO, como encapsulamento, polimorfismo, etc.
1. Classe
Uma 'classe' representa um conjunto de propriedades e métodos que se aplicam a todos os 'objetos' especificados dentro da classe. Os objetos podem ser de diferentes tipos, como integer, array ou string, etc. Uma classe é como um protótipo definido pelo usuário, com o qual diferentes 'objetos' podem ser criados.
2. Objeto
Um objeto é a unidade mais fundamental das linguagens OOP, representando dados reais na vida real. Os objetos carregam as propriedades da(s) classe(s) em que são invocados.
3. Método
Um método é um conjunto de instruções envolvendo diferentes funções que são colocadas juntas para executar uma tarefa específica. Ele retorna a saída após concluir as instruções conforme definido pelo usuário. Ele também pode realizar tarefas que não geram saída. Os métodos permitem que os programadores reutilizem os códigos sem redigitá-los. Java requer que todos os métodos pertençam a uma classe, ao contrário de linguagens como C++, C ou Python.
Conceitos de POO
Existem quatro princípios primários de programação orientada a objetos – Java exibe todas essas propriedades:
1. Abstração
A abstração de dados é uma propriedade das linguagens OOP que mostra os detalhes necessários enquanto mantém os outros detalhes irrelevantes do objeto de visibilidade para o usuário, como o código de implementação. Apenas os detalhes essenciais e relevantes são exibidos por esse recurso, o que ajuda os desenvolvedores a fazer alterações apropriadas rapidamente na funcionalidade de uma classe.
2. Encapsulamento
O encapsulamento de dados refere-se ao encapsulamento de dados em unidades. Essa propriedade das linguagens OOP protege os dados encapsulados de outras funções e métodos. Ele une o código e os métodos especificados para realizar operações em unidades singulares, evitando assim que sejam manipulados ou acessados por métodos externos. Isso também é conhecido como ocultação de dados.
3. Herança
A herança é outro recurso importante das linguagens OOP que permite que uma classe herde propriedades de outras classes. Ele trabalha com o conceito de reutilização de códigos, reduzindo assim a necessidade de redigitar recursos de classe repetidamente. A classe que herda de outra classe é conhecida como subclasse, e a classe que está sendo herdada é conhecida como superclasse.
4. Polimorfismo
O polimorfismo permite que um objeto assuma muitas formas e execute tarefas semelhantes ou exiba comportamentos semelhantes em métodos diferentes.
Polimorfismo em Java
O polimorfismo permite que uma única tarefa seja realizada de várias maneiras. É uma propriedade que ajuda a identificar e diferenciar entre entidades de código semelhantes, aumentando assim a eficiência das linguagens OOP.
Em Java, o polimorfismo é exibido declarando objetos como entidades separadas. Dessa forma, a mesma ação pode ser realizada de várias maneiras. O polimorfismo é ativado junto com a herança, permitindo que os objetos realizem diferentes tarefas usando as propriedades herdadas de diferentes classes. Diferenças na designação de métodos ou objetos distinguem duas entidades.
Aprenda cursos de desenvolvimento de software online das melhores universidades do mundo. Ganhe Programas PG Executivos, Programas de Certificado Avançado ou Programas de Mestrado para acelerar sua carreira.
Características do polimorfismo
1. Coerção
A conversão implícita de tipos de dados para evitar erros de tipo durante o tempo de compilação é coerção. Ele não inclui conversões de tipo de dados explícitas, mas segue apenas a hierarquia de conversão que o Java permite. Por exemplo, se um operando for flutuante e o operador for um inteiro, a resultante será flutuante.
2. Parâmetros/variáveis polimórficos
Um objeto ou variável que pode conter valores de vários tipos durante o tempo de execução é conhecido como variável ou parâmetro polimórfico. Ele determina que, ao declarar uma classe, os mesmos nomes de variáveis podem conter diferentes tipos de dados e os mesmos nomes de métodos podem conter diferentes parâmetros e tipos de retorno.
3. Sobrecarga interna do operador
A sobrecarga do operador usa um símbolo de operador conforme exigido pelo usuário. Java suporta sobrecarga de operador interno. É também um exemplo de polimorfismo estático.
Tipos de polimorfismo em Java
Em Java, o polimorfismo pode ser invocado usando:
1. Sobrecarga do método
A sobrecarga de métodos é o processo de criação de vários objetos ou métodos com o mesmo nome e pertencentes à mesma classe. Funciona dentro de uma classe.
2. Substituição do Método
A substituição de método é como uma subclasse constitui os mesmos métodos declarados na superclasse. Funciona em todas as classes. Se a subclasse contiver os mesmos métodos já presentes na superclasse, a função na subclasse será substituída.
Polimorfismo de subtipo em Java
O polimorfismo de subtipo depende de Upcasting e Late Binding.
- Upcasting é um processo pelo qual um objeto ou método pode promover um tipo de dado (float, integer, etc.) de um subtipo para um supertipo movendo-o para cima na hierarquia de herança.
- A ligação tardia é usada para chamar métodos que não são instâncias finais.
Nenhum operador está envolvido nisso porque o próprio subtipo é um membro do supertipo. Por exemplo, se uma classe tem o nome de cores, seus subtipos podem ser vermelho, azul, laranja, verde, etc. O polimorfismo de subtipo inclui os subtipos para exibir as propriedades do supertipo. No entanto, o acesso às propriedades individuais de cada subtipo é perdido.
Polimorfismo de tempo de execução em Java
Em Java, o polimorfismo de tempo de execução também é conhecido como Dynamic Method Dispatch ou Dynamic Binding. Isso é obtido por meio da substituição de método - chamando um método substituído para fornecer resolvido dinamicamente em tempo de execução. Isso pode ser alcançado através de funções e não de objetos.
Aqui está um exemplo de polimorfismo de tempo de execução em Java:
classe Carro{
void run(){System.out.println(“condução”);}
}
classe Volkswagen estende carro{
void run(){System.out.println(“Dirigindo com segurança com 90km”);}
public static void main(String args[]){
Carro c = new Volkswagen();//upcasting
b.run();
}
}
Saída :
Condução segura com 90km
Polimorfismo de tempo de compilação em Java
O polimorfismo em tempo de compilação é obtido pela sobrecarga de métodos. É o processo no qual a chamada para um método sobrecarregado é executada e resolvida durante o tempo de compilação. Também é conhecido como polimorfismo estático. Java é flexível o suficiente para permitir que o usuário use métodos ou objetos com os mesmos nomes, desde que suas declarações e propriedades de assinatura permaneçam diferentes.
Aqui está um exemplo de polimorfismo em tempo de compilação em Java:
class SimpleCalc
{
int add(int x, int y)
{
retorna x+y;
}
int add(int x, int y, int z)
{
retorna x+y+z;
}
}
demonstração de classe pública
{
public static void main(String args[])
{
SimpleCalc obj = new SimpleCalc();
System.out.println(obj.add(20, 30));
System.out.println(obj.add(40, 30, 20));
}
}
Saída :
50
90
Importância do Polimorfismo
O polimorfismo permite a escrita de métodos que podem constituir diferentes tipos de entidades com o mesmo nome. O polimorfismo é essencial em Java por causa de seus vários benefícios de uso e do escopo que ele fornece para tornar o código dinâmico:
- Permite a reutilização de códigos – os mesmos códigos não precisam ser escritos várias vezes.
- Ele permite que uma variável exiba vários comportamentos – ter o mesmo nome, mas propriedades diferentes podem abrir espaço para manter a consistência nos códigos.
- Redução de códigos em massa – ajuda na depuração enquanto também reduz o tempo de compilação, economizando memória, energia e tempo do usuário.
Possíveis problemas na implementação do polimorfismo
O polimorfismo pode ser confuso de usar e implementar. Reduz a legibilidade dos códigos, apresentando ameaças de vários bugs e erros. Ele também cria problemas com a execução de funções conforme necessário.
Há um problema clássico a ser observado: o problema da Classe Base Frágil. Refere-se à montagem e codificação impróprias de uma classe herdada que resulta em métodos que mostram resultados imprevisíveis.
Conclusões
A natureza frágil da herança pode levar a códigos disfuncionais e quebrados, apesar de todos os outros critérios permanecerem preenchidos. Esta questão arquitetural básica é considerada como o problema da Classe Base Frágil. Saiba mais sobre como o Java exibe os conceitos de POO participando do Programa PG Executivo da upGrad em Desenvolvimento de Software – Especialização em Desenvolvimento Full Stack . Seja orientado por especialistas do setor e construa conhecimento prático participando de projetos práticos e colaborativos com colegas.
Reserve o seu lugar hoje!
O que é ligação estática e dinâmica?
Objetos que são determinados no momento da compilação são conhecidos como ligação estática. Por outro lado, os tipos de objetos de associação dinâmica são determinados em tempo de execução. O primeiro é usado durante a sobrecarga do método e o último durante a substituição do método.
Quais são as duas diferenças fundamentais entre substituição de método e sobrecarga de método?
Em Java, a substituição de métodos não substitui os métodos estáticos, privados e finais, enquanto a sobrecarga de métodos sobrecarrega os métodos estáticos, privados e finais em Java. Além disso, substituir métodos de assuntos para vinculação dinâmica e, por outro lado, métodos sobrecarregados passam por vinculação estática.
Quais são as diferenças entre polimorfismo e herança em Java?
Em Java, existem vários pontos de diferença entre Polimorfismo e Herança:
1. A herança é uma representação do relacionamento pai-filho do mundo real na codificação. Mas o polimorfismo é um catalisador que usa essa relação para tornar o programa mais dinâmico.
2. A herança permite a reutilização de códigos da classe filha herdando o mesmo da classe pai. O polimorfismo, ao contrário, permite que a classe filha redefina seu comportamento existente novamente dentro da classe pai.