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 atributos Enquanto cada instância da classe (objeto) tem seus pró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) e variáveis de instância (atributos), há métodos estáticos (de classe) 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(“ ”); 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 [] exemplo: int [] a; Criação = new [ ]; exemplo: a = new int [12]; (Indexado de 0 a 11) Combinando declaração e criação [] = new [ ]; 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 arrays Arrays podem ser inicializados no momento de sua declaração: [] = {e 1,..., e n }; 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 a Exemplo: o método a seguir imprime um array de inteiros de tamanho arbitrário static 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 ( )
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Listas e Banco 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ção class 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 Modular class 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 ( )