Sobrecarga de métodos
O tema da sobrecarga de métodos já foi tratado neste post.
Sobrescrita de métodos
Sobrescrever um método é a possibilidade de uma subclasse (classe filha) modificar todo ou parte do comportamento herdado de sua superclasse (classe pai). Para sobrescrever um método basta utilizar o mesmo nome, tipo de retorno e os argumentos do método da superclasse e realizar as devidas modificações (customizações) na subclasse.
Se um método de uma superclasse for declarado como private, o mesmo não poderá ser sobrescrito pelas suas subclasses, pois membros de uma subclasse não acessam, membros private diretamente de sua superclasse.
Métodos sobrescritos não podem reduzir a acessibilidade, ou seja, se um método foi declarado como public na superclasse o método sobrescrito não pode ser declarado como private na subclasse.
Um método ou atributo de uma superclasse (em qualquer nível) pode ser invocado utilizando-se a palavra-chave
super
. Exemplo:public class Empregado {
private String nome; private double salario; private Date dataNasc;
public String getInformacoes() { return "Nome: " + nome + "\nSalario: " + salario; }}
public class Gerente extends Empregado {
private String departamento;
public String getInfomacoes() { // chamada à superclasse return super.getInformacoes() + “\nDepartamento: " + departamento; }}
Invocação de método virtual
Assumindo o exemplo anterior (Empregado e gerente), e que:
Empregado e = new Empregado();
Gerente g = new Gerente();
Se for invocado
e.getInformacoes
e g.getInformacoes
serão invocados diferentes métodos. Para o objeto do tipo Empregado será chamado o método getInformacoes da classe Empregado enquanto para o objeto do tipo Gerente será chamado o método getInformacoes da classe Gerente. Isto parece óbvio, certo? O que na verdade não é tão óbvio é o que acontece quando tem-se a seguinte situação:
Empregado e = new Gerente();
e.getInformacoes();
O comum seria pensar que o método invocado nesta situação seria aquele da classe Empregado. Não o(a) culpo por pensar assim (eu também pensei assim por um tempo ;D ), mas neste caso recebe-se o comportamento associado com o tipo em tempo de execução da variável, ou seja, o tipo do objeto referenciado pela variável (neste caso seria Gerente) e não com o tipo em tempo de compilação da variável. Esta característica é muito importante em linguagens orientadas a objetos geralmente referida como invocação virtual de método (virtual method invocation).
Nenhum comentário:
Postar um comentário