Um método herdade pode ser sobrescrito para permitir que a classe herdeira tenha comportamentos mais específicos que a superclasse. Um método sobrescrito não pode alterar a lista de parâmetros. Não pode também restringir o tipo de acesso. Um método declarado como
public não pode ser sobrescrito pela classe herdeira como
private. No entanto, pode-se alargar o tipo de acesso. Um método declarado como
protected pode ser sobrescrito pela classe herdeira como
public. O tipo de retorno não pode também ser modificado, a não ser trocado por um dos seus subtipos. Importante na situação de sobrescrita de métodos é reter também a idéia básica do polimofirsmo: em tempo de execução, o método chamado, por exemplo, por
a.eat, onde
a é declarado como
Animal a; não é o método da classe declarada, mas do tipo instânciado. Se
a se refere a um objeto do tipo Cavalo, que herda Animal, o método eat() chamado é da classe Cavalo.
O exemplo abaixo serve para ilustrar a situação de sobrescrita e também sobrecarga.
class Animal{
public Animal(String s){}
public void eat(Animal a){
System.out.println("Animal come");
}
}
class Cavalo extends Animal{
public Cavalo(String s){
super(s);
}
public void eat(Animal a){
System.out.println("Cavalo-Animal come");
}
public void eat(Cavalo c){
System.out.println("Cavalo come");
}
public static void main(String args[]){
Cavalo c = new Cavalo("c");
c.eat(c);
Animal a = new Animal("a");
a.eat(a);
a = new Cavalo("c");
a.eat(a);
}
}
O resultado da execução deste programa será:
Cavalo come
Animal come
Cavalo-Animal come
c.eat(c) chama o método eat() de Cavalo, que sobrescreve eat() de Animal.
a.eat(a) chama o método eat() de Animal. Por fim,
a.eat(a), onde a variável
a, embora declarada como do tipo Animal, se refere, na verdade, a uma instância de Cavalo, chama o método sobrecarregado eat(Animal a) da classe Cavalo. A lógica aqui é a seguinte: o tipo de objeto referido pela variável
a determina de qual classe o método será chamado. No caso, da classe Cavalo. E o tipo declarado da variável
a determina qual dos métodos sobrecarregados da Classe Cavalo será chamado.