Lista de Contas
nullLista de Contas: Assinatura
Quais são os métodos necessários? class ListaDeContas {
void inserir (Conta c) {}
void retirar (Conta c) {}
Conta procurar (String num) {} }
Listas de Contas: Descrição
class ListaDeContas {private Conta conta;
private ListaDeContas prox;
void inserir (Conta c) {
if (this.conta == null) {
this.conta = c;
prox = new ListaDeContas();
} else prox.inserir(c);
}
Listas de Contas: Descrição
void retirar (Conta c) {if (conta != null) {
if (conta == c) {
this.conta = prox.conta;
this.prox = prox.prox;
} else prox.retirar(c);
} }
Listas de Contas: Descrição
Conta procurar (String num) {
if (conta == null) return null;
else {
if (conta.numero() == num)
return conta;
elsereturn prox.procurar(num)
} }
Banco: Descrição Modular
class BancoModular {
private ListaDeContas;
void cadastro(Conta c) {contas.inserir(c);}
void debito(String num, double val) {
Conta c; c = contas.procurar(num); if (c != null) c.debito(val); else System.out.println("Conta inexistente!"); }
Exercício em Sala
Completar a implementação da classe
BancoModular com os métodos transfere e saldo.
Compare as duas implementações de
bancos: Banco e BancoModular. Quais
as vantagens e desvantagens de cada abordagem?
Dever de Casa
Dever de Casa
1
Desenvolva um sistema simples para
controle de estoque, contendo pelo
menos as classes Produto e Estoque, e
as seguintes operações: alterar as propriedades dos produtos (nome, preço, quantidade em estoque), retirar um produto do estoque, e verificar que produtos precisam ser repostos.
Dever de Casa
2
Defina em Java uma classe Pilha, de
pilhas de inteiros, tendo métodos para realizar as seguintes operações:
» push, insere um dado elemento no topo da pilha;
» top, dá como resultado o elemento que está no topo da pilha;
» pop, retira o elemento que está no topo da pilha..
Tipos de Módulos em Java
Classes
» agrupam definições de métodos, atributos, inicializadores, etc.
» definem tipos
Pacotes
» agrupam definições de classes
relacionadas
» estruturam sistemas de grande porte, facilitando a localização das classes » oferece um maior nível de abstração: há
mais classes do que pacotes
Pacotes e Diretórios
Cada pacote é associado a um diretório do
sistema operacional
Os arquivos neste diretório têm o mesmo
cabeçalho:
package nome_do_pacote;
Cada arquivo define uma ou mais classes
que fazem parte do pacote
Subdiretórios não correspondem a
Nomeando Pacotes
O nome de um pacote deve ser parte
do nome do seu diretório associado:
» o pacote exemplos.banco, deve estar no diretório /home/pasn/java/exemplos/banco, assumindo que o compilador Java foi informado para procurar pacotes em / home/pasn/java
Modificadores de Acesso
public
» atributos, métodos, inicializadores e classes
» declaração pode ser utilizada (é visível) em qualquer lugar
private
» atributos, métodos e inicializadores » declaração só pode ser utilizada na classe
onde ela é introduzida
Modificadores de Acesso
Protected
» atributos, métodos e inicializadores » declaração só pode ser utilizada no pacote
onde ela é introduzida, ou nas subclasses da classe onde ela é introduzida
default
» atributos, métodos, inicializadores e classes
» declaração só pode ser utilizada no pacote onde ela é introduzida
Importação de Pacotes
Importando definição de tipo específica:
» package segundo.pacote;
» import primeiro.pacote.NomeDoTipo;
Importando todas definições públicas:
» package segundo.pacote;
» import primeiro.pacote.*;
Importação de Pacotes: Detalhes
Tanto “NomeDoTipo” quanto
“primeiro.pacote.NomeDoTipo” podem
ser usados no corpo de “segundo.pacote”
“segundo.pacote” não pode definir um
tipo com nome “NomeDoTipo”
Importação de pacotes não é transitiva
nem distribui sobre os arquivos de um pacote
Pacotes da Biblioteca Java
Acesso a Internet e WWW (java.net)
Applets (java.applet)
Definição de interfaces gráficas
(java.awt)
Suporte a objetos distribuídos (java.rmi)
Interface com Banco de Dados
(java.sql)
Básicos: threads e manipulação de
strings (java.lang), arquivos (java.io),
Outros Modificadores de Acesso
Final
» Classes, Métodos e Variáveis » Construções Finais não podem ser
mudadas
• Variáveis: Constantes
• Classes: Não podem ser estendidas • Métodos: Não podem ser redefinidos
Outros Modificadores de Acesso
Static
» Métodos e Variáveis
» Construções Estáticas são associadas a uma classe e não a instâncias da classe
class Estatica } static int x=0;
Estatica() { x++;} }
Outros Modificadores de Acesso
Static
» Variáveis estáticas podem ser referenciadas através de qualquer instância da classe ou através do nome da classe. Ex:
1. Estatica e1 = new Estatica(); 2. Estatica e2 = new Estatica(); 3. e1.x = 100;
4. e2.x = 200;
5. Int OutroX = Estatica.x;
Outros Modificadores de Acesso
Static
» Toda aplicação deve conter um método estático.
• Métodos estáticos só podem acessar variáveis estáticas e outros métodos estáticos.
• Para acessar variáveis não estáticas ou métodos não estáticos deve-se instanciar uma classe.
Exercício em Sala
Estruture o exemplo de contas e
bancos utilizando pacotes
Dever de Casa
3
Estruture o sistema de controle de
estoque usando pacotes
Implemente a classe Banco usando a
classe Vector ou a classe Hashtable
(ambas do pacote “java.util”).
» OBS: Verifique no help quais são os construtores da classe e os métodos a serem utilizados !
Objeto Poupança
Número Saldo 21.342-7 875,32 Crédito Débito Número Saldo 21.342-7 875,32 Crédito Débito R. JurosEstados do Objeto Poupança
Número Saldo 21.342-7 875,32 Crédito Débito Número Saldo 21.342-7 875,32 Crédito Débito
R. Juros Saldo Número 21.342-7 875,32 Crédito Débito Número Saldo 21.342-7 895,32 Crédito Débito R. Juros Crédito(20)
Estados do Objeto Poupança
Número Saldo 21.342-7 875,32 Crédito Débito Número Saldo 21.342-7 875,32 Crédito Débito
R. Juros Saldo Número 21.342-7 875,32 Crédito Débito Número Saldo 21.342-7 884,07 Crédito Débito R. Juros R.Juros(0.01)
Classe de Poupanças: Descrição
class PoupancaD {
private String numero;
private double saldo;
void credito (double valor) {saldo = saldo + valor;}
String numero() {return numero;} ...
void rende_juros (double t)
{this.credito(saldo * t);} }
Classe de Bancos: Assinatura
class BancoD {
void cadastro_conta(Conta c) {}
void cadastro_poupanca(PoupancaD p) {} void credito_conta(String num, double val) {} void credito_poupanca(String num, double
val) {} ...
BancoD () {} }
Classe de Bancos: Descrição
class BancoD {private Conta[] contas;
private PoupancaD[] poupancas; private int indicep, indicec = 0;
Classe de Bancos: Descrição
void cadastro_conta(Conta c) { contas[indicec] = c; indicec = indicec + 1; } void cadastro_poupanca(PoupancaD p) { poupancas[indicep] = p; indicep = indicep + 1; }
Classe de Bancos: Descrição
privateConta procura_conta(String n) {
int i = 0;
boolean achou = false;
while ((! achou) && (i < indicec)) {
if (contas[i].numero() == n) achou = true; else i = i + 1;
}
if (achou == true) returncontas[i]; else return null;
} ...
Problemas
Duplicação desnecessária de código:
» A definição de PoupançaD é uma simples extensão da definição de Conta
» Clientes de Conta que precisam trabalhar também com PoupançaD terão que ter código especial para manipular poupanças
Falta refletir relação entre tipos do
“mundo real”
Subtipos e Subclasses
Conta PoupançaSubclasses
Comportamento» Objetos da subclasse comportam-se como os objetos da superclasse
Substituição
» objetos da subclasse podem ser usados no lugar de objetos da superclasse
Herança
Reuso de Código
» A descrição da superclasse pode ser usada para definir a subclasse
Extensibilidade
» algumas operações da superclasse podem ser redefinidas na subclasse
Classe de Poupanças: Assinatura
class Poupanca
extends Conta {
void rende_juros(double t) {}
Poupanca (String num) {} }
Classe de Poupanças: Descrição
class Poupancaextends Conta {
void rende_juros(double t) {
this.credito(this.saldo() * t);
}
Poupanca (String num) { super (num);}
}
Extends
subclasse extends superclasse
Mecanismo para definição de herança e
subtipos
Herança simples: só pode-se herdar
uma classe por vez
Extends: Restrições
Atributos e métodos privados são
herdados, mas não podem ser acessados diretamente
Qualificador protected: visibilidade
restrita a classe e subclasses
Construtores não são herdados
Construtor default só é disponível se
também for disponível na superclasse
Usando Poupanças
...
Poupanca poup;
poup = new Poupanca(¨21.342-7¨);
poup.credito(500.87); poup.debito(45.00);
System.out.println(poup.saldo()); ...
Subtipos: Substituição
...
Conta conta;
conta = new Poupanca(¨21.342-7¨);
conta.credito(500.87); conta.debito(45.00);
System.out.println(conta.saldo()); ...
Subtipos: Verificação Dinâmica
com Casts
...
Conta conta;
conta = new Poupanca(¨21.342-7¨);
...
((Poupanca) conta).rende_juros(0.01);
conta.imprime_saldo(); ...
Substituição e Casts
Nos contextos onde contas são usadas
pode-se usar poupanças
Nos contextos onde poupanças são
usadas pode-se usar contas com o uso
explícito de casts
Casts correspondem a verificação
dinâmica de tipos e podem gerar
exceções (Cuidado!)
Casts não fazem conversão de tipos
Classe de Bancos: Assinatura
class Banco {void cadastro(Conta c) {}
void credito(String num, double val) {}
void debito(String num, double val) {}
double saldo(String num) {}
void transfere(String d, String p, double
v) {} Banco () {} }
Subtipos: Substituição
...
Banco banco = new Banco(); banco.cadastro(new Conta(¨21.345-7¨)); banco.cadastro(new Poupanca (¨1.21.345-9¨)); banco.credito(¨21.345-7¨,129.34); banco.transfere(¨21.345-7¨,¨1.21.345-9¨, 9.34); System.out.print(banco.saldo(¨1.21.345-9¨)); ...
Exercício em Sala
Modifique a classe Banco para que seja
possível render juros de uma poupança. Isto é, adicione um novo método que rende os juros da poupança cujo número é parâmetro deste método; a taxa de juros corrente deve ser um atributo de Banco.
Subtipos: Verificação Dinâmica
com instanceof
...
Conta c = this.procura(¨123.45-8¨);
if (c instanceof Poupanca)
((Poupanca) c).rende_juros(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
» Casts geram exceções, instanceof retorna
false
» Casts são essenciais para verificação