HERANÇA E POLIMORFISMO Prof. Thiago Pereira Rique <[email protected]> http://thiagorique.wordpress.com/
HERANÇA E POLIMORFISMO
Prof. Thiago Pereira Rique
http://thiagorique.wordpress.com/
AGENDA
Herança Reescrita de método (overriding) Invocando o método reescrito Polimorfismo
HERANÇA
Vamos modelar a classe funcionário de um banco.
HERANÇ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.
HERANÇA
A classe gerente
HERANÇ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)
HERANÇ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.
HERANÇA
Classe Gerente estende Funcionario.
HERANÇA
Um Gerente é um Funcionario.
HERANÇA
Classe de teste.
HERANÇ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.
HERANÇA
Modificador de acesso protected
HERANÇA
Herança simples do Java
REESCRITA DE MÉTODO (OVERRIDING)
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%.
REESCRITA DE MÉTODO (OVERRIDING)
A classe Gerente vai herdar o método getBonificacao.
O resultado será 500, quando deveria ser 750 (trata-se de um gerente).
REESCRITA DE MÉTODO (OVERRIDING)
Em Java, podemos alterar o comportamento de um método herdado. Podemos reescrever (sobrescrever, override) este método.
INVOCANDO 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.
INVOCANDO O MÉTODO REESCRITO
Poderíamos fazer o seguinte:
Qual o problema com esta abordagem?
INVOCANDO 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
INVOCANDO O MÉTODO REESCRITO
Solução
POLIMORFISMO
O que guarda uma variável do tipo Funcionario? Uma referência, nunca um objeto em si.
POLIMORFISMO
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?
POLIMORFISMO
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.
POLIMORFISMO
Método que recebe um argumento do tipo Funcionario.
POLIMORFISMO
Em algum lugar da aplicação (ou no main):
POLIMORFISMO
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 http://www.caelum.com.br/apostilas/