Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a...

35
Copyright 1998, Departame nto de Informática da UFP E. Todos os direitos rese ariáveis e métodos estáticos, Passagem de parâmetros, Arrays e Listas

Transcript of Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a...

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Variáveis e métodos estáticos,Passagem de parâmetros,

Arrays e Listas

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Variáveis estáticas versus atributosEnquanto cada instância da classe (objeto) tem seuspróprios atributos, variáveis estáticas (ou de classe)são compartilhadas por todas as instâncias da classe

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Exemplo: classe Contas com um gerador de números de conta

prox_num = 132

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Em Java ... class ContaComGerador { private int numero; private double saldo; private static int prox_num = 1; void credito ... ContaComGerador () { numero = prox_num; saldo = 0; prox_num = prox_num + 1; }}

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Métodos estáticos e mensagens Da mesma forma que há variáveis estáticas (de classe) evariáveis de instância (atributos), há métodos estáticos (declasse) e métodos de instância (mensagens)• Um exemplo de mensagem é o método que retorna o

atributo saldo na classe Conta• Mesmo que presente na mesma classe dos atributos, um

método estático não tem acesso a estes• Um método estático pode ser acrescentado à classe

ContaComGerador para retornar o valor corrente de prox_num

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Os métodos de um “programa” são sempre estáticos

class Maior { private static int maior (int x, int y) { if (x > y) return x; else return y; } public static void main (String [] args) { int m, x, y; x = Util.readInt(); y = Util.readInt(); m = maior (x,y); System.out.println(m); }}

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Passagem de parâmetro

Em Java, a passagem é por valor, ou seja, o valor(e não o endereço) da variável é passado. Conseqüências: - Modificações no parâmetro formal não são refletidas no parâmetro real. - Uma expressão pode ser usada como argumento - Ineficiência em alguns casos (cópia)

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Exemplo

class PassagemPorValor { private static void incrementa (int x) { x = x + 1; System.out.println (“x = ” + x); } public static void main (String [] args) { int y = 1; System.out.println(“y = ” + y); incrementa (y); System.out.println(“y = ” + y); }}

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

O resultado desejado pode ser obtido assim ...

class PassagemPorValor { private static int incrementa (int x) { x = x + 1; System.out.println (“x = ” + x); return x; } public static void main (String [] args) { int y = 1; System.out.println(“y = ” + y); y = incrementa (y); System.out.println(“y = ” + y); }}

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Aliasing

• Aliasing ocorre quando mais de um identificador está associado a um mesmo endereço de memória

• Apesar da passagem de parâmetros em Java ser por valor, pode-se ter aliasing quando um objeto é passado como parâmetro

• É sempre a referência ao objeto que é passada (por valor) e não o objeto em si

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Exemplo de aliasing em Java

class Aliasing { private static void credita (Conta a, Conta b) { a.credito(100); b.credito(100); } public static void main (String [] args) { Conta c = new Conta(“205.789-6”); credita (c, c); System.out.println(c.saldo()); }}

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Aliasing também pode ocorrer em Java como conseqüência de uma atribuição ...

• Atribuição de um identificador de objeto a um outro de mesmo tipo é permitido, mas o endereço (e não o valor) é atribuído.

• Exemplo ... Conta a = new Conta(“123-4”); Conta b; b = a; \\ a e b passam a referenciar a mesma conta b.credito (100); System.out.println (a.saldo()); ...

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Mas a referência é passada por valor ...

class Referencia { private static void redefine(Conta a) { Conta b = new Conta(“567-8”); a.credito(100); a = b; a.credito(100); } } public static void main (String [] args) { Conta c = new Conta(“123-4”); redefine (c); System.out.println(c.numero() + c.saldo()); }}

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Arrays Estrutura de dados que permite agrupar variáveis de um

mesmo tipo• Declaração <tipo> [] <lista-de-identificadores> exemplo: int [] a;• Criação <identificador> = new <tipo> [<tamanho>]; exemplo: a = new int [12]; (Indexado de 0 a 11)• Combinando declaração e criação <tipo> [] <identificador> = new <tipo> [<tamanho>]; exemplo: int [] a = new int [12];

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Inicialização de arraysArrays podem ser inicializados no momento de sua declaração: <tipo> [] <identificador> = {e1, ..., en}; Exemplo: a declaração String [] cores = { “verde”, “azul”, “preto” };equivale a String [] cores = new String [3]; cores [0] = “verde”; cores [1] = “azul”; cores [2] = “preto”;

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Tamanho de um array

Se a é um identificador de array, a.length dá o tamanho de aExemplo: o método a seguir imprime um array de inteiros de tamanho arbitráriostatic void imprime (int [] a) { for (int i = 0; i < a.length; i = i + 1) System.out.println (a[i]);}

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Classe de Bancos: Operações

• cadastro de uma nova conta• crédito• débito • saldo • transferência entre contas

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Classe de Bancos: Descrição

class Banco { private Conta[] contas; private int indice = 0;

void cadastro(Conta c) { contas[indice] = c; indice = indice + 1; }

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

private Conta procura(String n) { int i = 0; boolean achou = false; while ((! achou) && (i < indice)) { if (contas[i].numero().equals(n)) achou = true; else i = i + 1; } if (achou) return contas[i]; else return null; }

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

void debito(String num, double val) { Conta c; c = this.procura(num); if (c != null) c.debito(val); else System.out.println("Conta inexistente!"); }

A operação credito é similar

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Exercício

• Completar a implementação da classe Banco com o construtor e os métodos transfere e saldo.

• Acrescente um novo método para remover uma conta

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Exercício

• Desenvolva um sistema simples de eleição, usando a classe já implementada para modelar um candidato. Definir uma outra classe para agrupar candidatos (usando arrays). Elabore um programa que lê um número arbitrário de nomes de candidatos e efetua a contagem; no final, indique o vencedor e o total de votos.

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Exercício

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

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Leitura• Livro texto (Programming in Java) Capítulos 2 (2.9) e 5 (5.8-5.9)

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Listas eBanco Usando Listas

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Lista Encadeada de Contas

null

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Listas de Contas: Operações

• inserir • retirar • procura

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Listas de Contas: Descriçãoclass Lista { private Conta conta; private Lista prox; void inserir (Conta c) { if (this.conta == null) { this.conta = c; prox = new Lista(); } else prox.inserir(c); }

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

void retirar (Conta c) { if (conta != null) { if (conta == c) { this.conta = prox.conta; this.prox = prox.prox; } else prox.retirar(c); } else System.out.println(“Conta Inexistente”); }

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Conta procura (String num) { if (conta == null) return null; else { if (conta.numero().equals == num) return conta; else return prox.procura(num) }}

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Banco: Descrição Modularclass BancoModular { private Lista contas = new Lista(); void cadastro(Conta c) {contas.inserir(c);} void debito(String num, double val) { Conta c; c = contas.procura(num); if (c != null) c.debito(val); else System.out.println("Conta inexistente!"); }

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Exercícios

• Completar a implementação da classe BancoModular com os métodos transfere e saldo.

• Compare as duas implementações de bancos: Banco e BancoModular. Um usuário perceberia alguma diferença entre elas? Quais as vantagens e desvantagens de cada abordagem?

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Exercício

• Suponha que, por questões de eficiência, temos que modificar a maneira como as contas são armazenadas no banco. Qual implementação de bancos seria mais facilmente modificada: Banco ou BancoModular?

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Exercício

• Modifique o sistema de eleição para agrupar candidatos em uma lista (ao invés de em um array).

• Modifique o sistema de estoque de forma análoga

Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor.

Leitura• Livro texto (Programming in Java) Capítulos 2 (2.9) e 5 (5.8-5.9)