Orientação a Objetos e Java Graduação em Ciência da Computação Centro de Informática, UFPE...
-
Upload
henrique-castro -
Category
Documents
-
view
213 -
download
0
Transcript of Orientação a Objetos e Java Graduação em Ciência da Computação Centro de Informática, UFPE...
Orientação a Objetos e JavaGraduação em Ciência da Computação
Centro de Informática, UFPE
Alexandre [email protected]
http://www.cin.ufpe.br/~acm
Redefinição de Métodos e Ligação Dinâmica
Subtipos: Verificação Dinâmica com instanceof
...Conta c = this.procurar(”567-8");if (c instanceof Poupanca) ((Poupanca) c).renderJuros(0.01);else System.out.print("Poupança inexistente!");...
Verificação Dinâmica de Tipos
• Casts e instanceof:– ((Tipo) variável) – variável instanceof Tipo– O tipo de variável deve ser supertipo de Tipo– O Cast “((Tipo) variável)” gera uma exceção se
“variável instanceof Tipo” retornar false– Casts são essenciais para verificação estática de
tipos (compilação)
Número Saldo
21.342-7 875,32
Crédito
Débito
Objeto Conta Especial
R. Bônus
Bônus
11,60
Número Saldo
21.342-7 875,32
Crédito
Débito
Estados de uma Conta Especial
Número Bônus Saldo
21.342-7 11,80 895,32
Crédito
Débito
Número Bônus Saldo
21.342-7 11,60 875,32
Crédito
Débito
Crédito(20)
R. Bônus R. Bônus
Número Saldo
21.342-7 875,32
Crédito
Débito
Estados de uma Conta Especial
Número Bônus Saldo
21.342-7 0,00 887,12
Crédito
Débito
Número Bônus Saldo
21.342-7 11,80 875,32
Crédito
Débito
R. Bônus()
R. Bônus R. Bônus
Contas Especiais: Assinatura
public class ContaEspecial extends Conta { public ContaEspecial(String numero) {} public void renderBonus() {} public double getBonus() {} public void creditar(double valor) {} }
Contas Especiais: Descrição
public class ContaEspecial extends Conta {
private double bonus;
public ContaEspecial(String numero) { super (numero); bonus = 0.0; }
public void creditar(double valor) { bonus = bonus + (valor * 0.01); super.creditar(valor);}
public void renderBonus() { super.creditar(bonus); bonus = 0;}
public double getBonus() { return bonus;}
Redefinição de Métodos
• Preservação da assinatura: tipos dos argumentos e resultados da redefinição têm que ser iguais aos tipos da definição
• Semântica e Visibilidade dos métodos redefinidos deve ser preservada
• Só é possível acessar a definição dos métodos da superclasse imediata (via super)
Usando Contas Especiais
...ContaEspecial contae;contae = new ContaEspecial("21.342-7");contae.creditar(200.00); contae.debitar(100.00);contae.renderBonus();System.out.print(contae.getSaldo());...
Ligações Dinâmicas
...Conta conta;conta = new ContaEspecial("21.342-7");((Conta)conta).creditar(200.00); conta.debitar(100.00);((ContaEspecial) conta).renderBonus();System.out.print(conta.getSaldo());...
Ligações Dinâmicas
Conta conta;conta = new ContaEspecial("21.342-7");
((Conta)conta).creditar(200.00);
“Como existe uma redefinição do método creditar na classe ContaEspecial,o Cast serve para informar a Java qual definição estamos interessados.”
Ligações Dinâmicas
Conta conta;conta = new ContaEspecial("21.342-7");
conta.debitar(100.00);
“Já o método debitar só existe na classe Conta, então Java acessa sua definição diretamente.”
Ligações Dinâmicas
Conta conta;conta = new ContaEspecial("21.342-7");
((ContaEspecial) conta).renderBonus();
“Finalmente, o método renderBonus só existe na classe ContaEspecial. Nesse caso, Java deve ser informado através de um Cast onde localizar sua definição. Se isso não for feito, uma exceção será gerada.”
Ligações Dinâmicas
• Dois métodos com o mesmo nome e tipo: – definição e redefinição, qual usar?
• O código é escolhido dinamicamente (em tempo de execução) e não estaticamente (em tempo de compilação)
• Escolha se dá baseado na classe do objeto associado à variável destino do método
Exercício
• Modifique a classe Banco para que seja possível computar o bônus de uma conta especial. Foi necessário redefinir algum método de Banco? Justifique a sua resposta.
Classe Banco: Assinaturapublic class Banco { public Banco () {} public void cadastrar(Conta conta) {} public void creditar(String numero, double valor) {} public void debitar(String numero, double valor) {} public double getSaldo(String numero) {} public void transferir(String contaOrigem, String contaDestino, double valor) {} }
Leitura
• Páginas 20 a 24, e 116 a 120 do livro Dominando o Java (de Patrick Naughton)
• Seções 1.10.1, 3.1 a 3.6, 5.13 a 5.20, e 8.5 a 8.8 do livro The Java Programming Language (de Ken Arnold e James Gosling)