Orientação a Objetos e Java Graduação em Ciência da Computação Centro de Informática, UFPE...

20
Orientação a Objetos e Java Graduação em Ciência da Computação Centro de Informática, UFPE Alexandre Mota [email protected] http://www.cin.ufpe.br/ ~acm

Transcript of Orientação a Objetos e Java Graduação em Ciência da Computação Centro de Informática, UFPE...

Page 1: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

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

Page 2: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

Redefinição de Métodos e Ligação Dinâmica

Page 3: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

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!");...

Page 4: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

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)

Page 5: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

Número Saldo

21.342-7 875,32

Crédito

Débito

Objeto Conta Especial

R. Bônus

Bônus

11,60

Page 6: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

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

Page 7: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

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

Page 8: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

Contas Especiais: Assinatura

public class ContaEspecial extends Conta { public ContaEspecial(String numero) {} public void renderBonus() {} public double getBonus() {} public void creditar(double valor) {} }

Page 9: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

Contas Especiais: Descrição

public class ContaEspecial extends Conta {

private double bonus;

public ContaEspecial(String numero) { super (numero); bonus = 0.0; }

Page 10: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

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;}

Page 11: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

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)

Page 12: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

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());...

Page 13: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

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());...

Page 14: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

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.”

Page 15: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

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.”

Page 16: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

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.”

Page 17: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

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

Page 18: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

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.

Page 19: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

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) {} }

Page 20: Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br acm.

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)