H ERANÇA E P OLIMORFISMO Prof. Thiago Pereira Rique
A GENDA Herança Reescrita de método (overriding) Invocando o método reescrito Polimorfismo
H ERANÇA Vamos modelar a classe funcionário de um banco.
H ERANÇA Em um banco, há também um gerente. Um gerente guarda as mesmas informações de um funcionário comum. Um gerente possui informações e funcionalidades um pouco diferentes.
H ERANÇA A classe gerente
H ERANÇA Precisamos mesmo de outra classe? Se um dia precisarmos adicionar uma nova informação para todos os funcionários, precisaremos passar por todas as classes de funcionário e adicionar este atributo. Em Java, podemos relacionar duas classes de modo que uma herda características que a outra possui. Classe mãe (superclasse) e classe filha (subclasse) No nosso caso, gostaríamos que gerente tivesse o que funcionário tem (gerente seria uma extensão de funcionário)
H ERANÇA Herança Classes de objetos novas são derivadas absorvendo-se características de classes existentes e adicionando-se características únicas dessas mesmas classes.
H ERANÇA Classe Gerente estende Funcionario.
H ERANÇA Um Gerente é um Funcionario.
H ERANÇA Classe de teste.
H ERANÇA A subclasse herda todos os membros (atributos e métodos) da superclasse. Membros private não podem ser acessados diretamente pela subclasse. E se precisarmos acessar os atributos que herdamos? Modificador de acesso protected Visível pela classe, subclasses e classes no mesmo pacote.
H ERANÇA Modificador de acesso protected
H ERANÇA Herança simples do Java
R EESCRITA DE MÉTODO (O VERRIDING ) Considere a situação No fim do ano, os funcionários do banco recebem uma bonificação. Funcionários comuns recebem 10% do salário e gerentes, 15%.
R EESCRITA DE MÉTODO (O VERRIDING ) A classe Gerente vai herdar o método getBonificacao. O resultado será 500, quando deveria ser 750 (trata-se de um gerente).
R EESCRITA DE MÉTODO (O VERRIDING ) Em Java, podemos alterar o comportamento de um método herdado. Podemos reescrever (sobrescrever, override ) este método.
I NVOCANDO O MÉTODO REESCRITO Após reescrito, não podemos mais chamar o método herdado da superclasse, mas podemos invocá-lo se estivermos dentro da classe. Palavra reservada super Considere a seguinte situação: Suponha que para calcular a bonificação de um Gerente fazemos o mesmo cálculo de um Funcionario, acrescentando R$ 1000.
I NVOCANDO O MÉTODO REESCRITO Poderíamos fazer o seguinte: Qual o problema com esta abordagem?
I NVOCANDO O MÉTODO REESCRITO Se o getBonificacao de Funcionario mudar, teremos que modificar o getBonificacao de Gerente. Solução O getBonificacao de Gerente pode chamar o getBonificacao de Funcionario. Palavra reservada super
I NVOCANDO O MÉTODO REESCRITO Solução
P OLIMORFISMO O que guarda uma variável do tipo Funcionario? Uma referência, nunca um objeto em si.
P OLIMORFISMO Conceito Polimorfismo é a capacidade de um objeto poder ser referenciado de várias formas. ATENÇÃO: isto não significa que o objeto se transforma em outro tipo. E se tentássemos funcionario.getBonificacao(); ? Qual seria o retorno? 500 ou 750?
P OLIMORFISMO Apesar de estarmos nos referindo ao objeto como um Funcionario, o método invocado será o do Gerente, pois o objeto é do tipo Gerente. Logo, o valor retornado será 750. Para que criar um Gerente e referenciá-lo como um Funcionario? Situação mais comum Método que recebe um argumento do tipo Funcionario.
P OLIMORFISMO Método que recebe um argumento do tipo Funcionario.
P OLIMORFISMO Em algum lugar da aplicação (ou no main):
P OLIMORFISMO No método registra da classe ControleDeBonificacoes, o método getBonificacao do argumento é chamado. Quando o argumento se tratar de um Gerente, o método invocado será o reescrito, isto é, será invocado o método getBonificacao do Gerente. Reafirmando: Não importa como nos referenciamos a um objeto, o método que será invocado é sempre o que é dele.
REFERÊNCIA Apostila caelum-java-objetos-fj11