É, eu também confundia as duas coisas. Overriding é, de forma simplificada, quando você altera o comportamento de um método herdado. Você redefine o método, com o mesmo nome identificador e lista de parâmetros, com base nas regras do post anterior.
Overloading, no entanto, é quando você usa o mesmo nome identificador, mas diferentes tipos de retorno, lista de parâmetros e modificadores de acesso.
Overloading, no entanto, é quando você usa o mesmo nome identificador, mas diferentes tipos de retorno, lista de parâmetros e modificadores de acesso.
class Base {
public String metodo() {
return "apenas um teste na classe base";
}
protected String metodo(Integer numero) {
return numero.toString() + " integer";
}
String metodo(String string) {
return string;
}
}
class Derivada extends Base {
public String metodo() {
return "apenas um teste na classe derivada";
}
public String metodo(boolean teste) {
if (teste) {
return "verdadeiro";
}
return "falso";
}
protected String metodo(Short numero) {
return numero.toString() + " short";
}
}
public class Principal {
public static void main(String[] args) {
Derivada derivada = new Derivada();
Base base = derivada;
System.out.println(
base .getClass().getName() +
": " + base .metodo());
System.out.println(
derivada.getClass().getName() +
": " + derivada.metodo(1));
System.out.println(
derivada.getClass().getName() +
": " + derivada.metodo(true));
}
}
No exemplo acima, o método método é tanto sobrecarregado quanto sobrescrito na classe derivada. E seguindo as regras discutidas nos posts anteriores, não sentimos dificuldades ao concluir que a primeira saída é dada pela versão sem parâmetros do método método, sobrescrita na classe derivada.
Mas as coisas já complicam quando tentamos analisar a segunda saída. O literal 1 é um Integer ou Short? Copie e compile. Pra mim, bateu Integer. Daí eu fui pesquisar, e achei:
int is the default data type of an integer literal. [www.javaying.com]
E daí, concluímos que o literal 1 foi automaticamente convertido para um Integer, e então, a versão do método na classe base foi chamada.
class Base {}
class Derivada extends Base {}
public class Principal {
public void analizaObjeto(Base base) {
System.out.println("objeto da classe base");
}
public void analizaObjeto(Derivada derivada) {
System.out.println("objeto da classe derivada");
}
public void analizaObjeto(Object objeto) {
System.out.println("é um objeto");
}
public static void main(String[] args) {
Principal principal = new Principal();
Derivada derivada = new Derivada();
Base base = derivada;
principal.analizaObjeto(base);
}
}
Você
objeto da classe base
A versão do método sobrecarregado a ser chamado é decidida em tempo de compilação, com base no tipo declarado pela referência passada por parâmetro.
