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