Overloading (Sobrecarga).
Um método sobrecarregado é aquele que aparece mais de uma vez em uma classe (ou subclasse) com assinatura (lista de argumentos) distinta.
O tipo de retorno e a implementação, podem ser, opcionalmente diferentes. Então podemos dizer que métodos sobrecarregados:
- devem possuir assinaturas distintas.
- podem possuir tipos de retorno distintos.
- podem possuir modificadores de acesso distintos.
- podem declarar exceções verificadas novas ou mais abrangentes.
Veja o seguinte exemplo de método sobrecarregado:
class Aritmetica{
public int soma(int a, int b){
return a + b;
}
public double soma(double a, double b){
return a + b;
}
}
//Chamando o metodo soma sobrecarregado.
public class TestaAritmetica{
public static void main(String[] args){
Aritmetica calculadora = new Aritmetica();
int a = 10;
int b = 20;
int somaDosInts = calculadora.soma(a, b);
int somaDosDoubles = calculadora.soma(10.5 + 20.5);
}
}
No exemplo anterior, na classe TestaAritmetica, somaDosInts recebe o retorno da chamada a primeira forma do método sobrecarregado Aritmetica.soma que é soma(int, int). E somaDosDoubles recebe o retorno da chamada a segunda forma do método sobrecarregado Aritmetica.soma, que é soma(double, double). É um método polimórfico, pois tem mais de uma forma.
É o tipo de argumento que irá acionar a forma chamada de um método sobrecarregado, pois a identidade do método é dada pela sua assinatura. Veja este outro exemplo:
class Pet{}
class Cao extends Pet{}
class Lar{
public void maisUmNaFamilia(Pet pet){
System.out.println("Chegou um pet na casa!");
}
public void maisUmNaFamilia(Cao cao){
System.out.println("Chegou um cão na casa!");
}
public static void main(String[] args){
Lar lar = new Lar();
Pet pet = new pet();
Cao cao = new Cao();
Pet refParaCao = new Cao();
lar.maisUmNaFamilia(pet);
lar.maisUmNaFamilia(cao);
lar.maisUmNaFamilia(refParaCao);
}
}
E no caso do exemplo anterior, qual seria a saída?
Lembre-se: a forma do método sobrecarregado será identificada pelos tipos da lista de parâmetros, pela assinatura do método. Logo, independente de refParaCao guardar uma referência de Cao, seu tipo é Pet e por isso o método forma do método sobregarregado Lar.maisUmNaFamilia que será invocada é: Lar.maisUmNaFamilia(Pet). Potanto a saída será:
Chegou um pet na casa!
Chegou um cao na casa!
Chegou um pet na casa!
É isso aí! Estes conhecimentos são cobrados na prova SCJP/OCJP e espero que lhe ajudem a esclarecer algumas questões importantes. No próximo post discutiremos Overriding, as confusões entre os dois conceitos e como o examinador pode se aproveitar disso para lhe confundir no exame.
Forte abraço,
Mauricio da Silva Marinho