Polimorfismo em Java: como sobrecarregar ou substituir métodos

A sobrecarga e a substituição de métodos são as duas maneiras pelas quais Java demonstra polimorfismo. O polimorfismo vem de uma combinação de duas palavras gregas: "poli" que significa muitos e "metamorfose" que significa forma. Portanto, o polimorfismo permite que os métodos assumam muitas formas.

Siga este guia para aprender como sobrecarregar ou substituir métodos em Java.

O que é sobrecarga de método?

"Sobrecarga de método" refere-se à definição de métodos diferentes em uma classe com o mesmo nome. Os métodos devem ter assinaturas diferentes. Uma assinatura de método é a combinação do nome de um método e lista de parâmetros. Não inclui o tipo de retorno.

O compilador sabe qual método usar, verificando o tipo, o número de parâmetros e a ordem em que são colocados.

Relacionado: Explorando Herança na Linguagem de Programação Java

A sobrecarga de método demonstra polimorfismo em tempo de compilação. Polimorfismo de tempo de compilação significa que o compilador Java vincula um objeto à sua funcionalidade em tempo de execução. O compilador verifica as assinaturas do método para fazer isso.

Esse tipo de polimorfismo também é conhecido como ligação estática ou inicial.

Veja o exemplo de sobrecarga de método abaixo:

 class Arithmetic{
int cube(int x){
return x*x*x;
}
double cube(double x){
return x*x*x;
}
float cube(float x){
return x*x*x;
}
public static void main(String[] args){
Arithmetic myMultiplication = new Arithmetic();
System.out.println("The cube of 5 is " + myMultiplication.cube(5));
System.out.println("The cube of 5.0 is " + myMultiplication.cube(5.0));
System.out.println("The cube of 0.5 is " + myMultiplication.cube(0.5));
}
}

Resultado:

 The cube of 5 is 125
The cube of 5.0 is 125.0
The cube of 0.5 is 0.125

O código acima mostra como você pode obter um cubo de diferentes tipos ( int , double , float ) usando o mesmo método.

Geralmente, a sobrecarga de método é usada para definir métodos semelhantes com diferentes tipos de parâmetros.

O que é o método substituindo?

Isso se refere a uma implementação diferente de um método em uma subclasse. O método já deve ter sido definido na classe pai.

O método de sobrescrita (ou seja, aquele na subclasse) deve ter a mesma assinatura de método que na superclasse. O tipo de retorno do método de substituição pode ser o mesmo ou um subtipo daquele da superclasse.

A substituição geralmente é usada para incluir uma implementação específica do comportamento de um objeto na subclasse.

 class Account{
public void message() {
System.out.println("
Thank you for opening an account with us!");
}
public static void main(String args[]) {
Account myAccount = new Account();
Savings mySavings = new Savings();
FixedDeposit myFixedDepo = new FixedDeposit();
myAccount.message();
mySavings.message();
myFixedDepo.message();
}
}
class Savings extends Account {
public void message() {
System.out.println("
Thank you for opening a Savings account with us!");
}
}
class FixedDeposit extends Account {
public void message() {
System.out.println("
Thank you for opening a Fixed Deposit account with us!");
}
}

Resultado:

 Thank you for opening an account with us!
Thank you for opening a Savings account with us!
Thank you for opening a Fixed Deposit account with us!

O exemplo acima mostra como o método message () é sobrescrito nas subclasses Savings e FixedDeposit . Mensagens diferentes serão exibidas para titulares de contas bancárias com uma conta poupança e aqueles com uma conta de depósito fixo.

Relacionado: O que você precisa saber sobre como usar strings em Java

Também é importante notar que a substituição de método demonstra polimorfismo de tempo de execução ou despacho de método dinâmico. Isso significa que o método a ser chamado é resolvido em tempo de execução e não na compilação.

Para evitar que um método seja sobrescrito, use a palavra-chave final .

 final void message (){
System.out.println("
Thank you for opening an account with us!");
}

Quando uma subclasse tenta sobrescrevê-lo, ocorrerá um erro de compilação.

Idealmente, todos os métodos chamados em um construtor devem ser finais . Isso evita quaisquer alterações não intencionais que possam ser causadas pelas subclasses.

Às vezes, você pode precisar acessar um método sobrescrito dentro do método sobrescrito. Você pode usar a palavra chave super seguida pelo operador ponto ( . ) E o nome do método nesse caso.

Considere a superclasse Animal .

 class Animal{
public void move() {
System.out.println("
I can move.");
}
}

Abaixo está uma subclasse, chamada Fish , que substitui move () :

 class Fish extends Animal {
public void move() {
System.out.println("
I can swim.");
super.move();
}
public static void main(String args[]){
Fish Tilapia = new Fish();
Tilapia.move();
}
}

Resultado:

 I can swim.
I can move.

Ao substituir um método, você também precisa estar ciente do modificador de acesso usado. O modificador na subclasse deve ter o mesmo nível de visibilidade ou mais alto do que na classe base. Por exemplo, se o método na classe base for definido como protegido , o método de substituição pode ser protegido ou público .

Código simples com polimorfismo

A substituição e a sobrecarga de métodos são importantes para a simplificação do código, e um código simples é uma boa prática.

Por quê? Imagine uma base de código complexa com mais detalhes do que a Grand Central Station. Agora imagine que um inseto devastador comece a destruir seu trabalho árduo diante de seus olhos. Você precisa isolar a fonte da infecção e fazer isso rapidamente.

Boa sorte, você não simplificou seu código … Agora você está prestes a obter uma verdadeira lição de criptografia. Empregar estruturas de dados eficazes e fazer o que puder para encurtar o código (como manter o DRY em mente) é a sua melhor defesa contra uma situação como essa.

O próximo passo em sua lista de aprendizagem Java deve ser trabalhar com matrizes. Eles são estruturas de dados importantes usadas para armazenar lotes de pontos de dados.