Programação com a BD Programação OOAcesso em Java Curso: Técnico em Informática Campus: Ipanguaçu José José Maria Maria Monteiro Monteiro Pontifícia PontifíciaUniversidade Universidade Católica Católica do do Rio Rio de de Janeiro Janeiro –– PUC PUCPUC PUC---Rio Rio Departamento Departamento de de Informática Informática Clayton Maciel Costa [email protected]@inf.puc [email protected] [email protected] rio.br [email protected] Programação com Acesso a BD Unidade IV: Ponteiros, Referências e Arrays 1 Orientação a Objetos em Java Arrays Definição: estrutura de dados que define uma coleção ordenada de um número fixo de elementos de dados homogêneos; Em Java, arrays são objetos; Uma vez criado um array, seu tamanho nunca muda Orientação a Objetos em Java Arrays 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]; 2 Orientação a Objetos em Java Inicialização Arrays Quando o array é criado, todos os elementos são inicializados para o valor default de <tipo>; Exemplo: int [] a; a = new int[10]; // Array de 10 inteiros (default = 0) Exemplo: double [] a = new double[10]; // Array de 10 números reais (double) (default = 0.0) Exemplo: boolean [] a = new boolean[10]; // Array de 10 booleanos (default = false) Exemplo: String [] a = new String[10]; // Array de 10 strings (tipo complexo) (default = null) Orientação a Objetos em Java Inicialização Arrays Arrays 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”; 3 Orientação a Objetos em Java Inicialização Arrays Exemplo: a declaração int vet[] = { 1, 3, 5, 7, 10 }; equivale a int [] vet = new vet [5]; vet [0] = 1; vet [1] = 3; vet [2] = 5; vet [3] = 7; vet [4] = 10; Orientação a Objetos em Java Inicialização Arrays int [] v = new int[3]; Pilha # heap 0 0 0 v[0] = 23; v[2] = 52; Pilha # heap 23 0 52 4 Orientação a Objetos em Java Inicialização Arrays heap Pilha String [] s = new String [2]; # s[0] = “Verde”; s[1] = “Amarelo”; Pilha # Pilha # null null heap # heap “Verde” null heap # # heap “Verde” “Amarelo” Orientação a Objetos em Java Inicialização Arrays heap Pilha Point [] p = new Point [2]; # p[0] = new Point(); Pilha # null null heap # null public class Point { public int x; public int y; } heap 0 p[0].x 0 p[0].y 5 Orientação a Objetos em Java Tamanho de um Arrays 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]); } Orientação a Objetos em Java Tamanho de um Arrays Exceção gerada se houver tentativa de acesso indevida aos índices do array: – ArrayIndexOutOfBoundsException; Exemplo: int vet[] = { 1, 3, 5, 7, 10 }; System.out.println (vet[5]); System.out.println (vet.length); 6 Orientação a Objetos em Java Arrays Podem ter uma (one-dimensional array) ou múltiplas dimensões (arrays de arrays). Sendo e um array de duas dimensões com dois elementos na primeira e quatro na segunda (2x4), a implementação desse array em java utilizará três objetos array, conforme o esquema abaixo: e e e0 e00 e01 e02 e03 e0 e1 e10 e11 e12 e13 e1 e00 e01 e02 e03 e10 e11 e12 e13 Orientação a Objetos em Java Arrays Multidimensionais Declaração <tipo> [] [][]...[] <lista-de-identificadores>; Exemplo: int [] [] a; // Array de duas dimensões int [] a []; // Expressão equivalente Criação <identificador> = new <tipo> [<tamanho>]... [<tamanho>]; Exemplo: a = new int [2][3]; // Criando array 2 x 3 (inteiros) Combinando declaração e criação <tipo> [] [][]...[] <ident.> = new <tipo> [<tam.>] ... [<tam.>]; Exemplo: int [][] a = new int [2][3]; 7 Orientação a Objetos em Java Arrays Multidimensionais Inicializando Arrays Multidimensionais Exemplo: double taxas[][] = { { 1,2,3 }, {4,5,6} }; // declarando e inicializando um array com dimensões internas diferentes String[][] cores = { { “Verde”, “Amarelo”, null }, // 3 elementos { null, null }, // 2 elementos {}, //zero elementos null // Array ainda não construído }; Orientação a Objetos em Java Arrays Multidimensionais Na criação de arrays multidimensionais com o operador new, a profundidade dos arrays mais internos pode ser omitida: double matrix[][] = new double[3][]; A inicialização poderia ser assim: for (int i = 0; i < matrix.length; ++i) matrix[ i ] = new double[ i+1 ]; A representação da memória, nesse caso, seria: 8 Orientação a Objetos em Java Arrays Multidimensionais matrix[0] : double[] matrix[1] : double[] length = 1 [0 ] 8.5 length = 2 [0 ] [1 ] 6.3 4.4 matrix : double[][] length = 3 matrix[2] : double[] [ 0 ] : Ref ( double[] ) [ 1 ] : Ref ( double[] ) [ 2 ] : Ref ( double[] ) length = 3 [0 ] [1 ] [2 ] 1.5 2.9 5.5 Orientação a Objetos em Java Métodos Procedimentos e Funções são representados em Java por métodos. A diferença está no tipo de retorno. Se o tipo de retorno for nulo, indicado pela palavra void, o método representa um procedimento. Caso contrário, ou seja, se existe um tipo de retorno, o método representa uma função. Métodos (em Java) Procedimentos NÃO têm tipo de retorno (void) Funções têm tipo de retorno 9 Orientação a Objetos em Java Métodos Declaração de um Método: public static tipoDeRetorno nomeDoMétodo ( tipo1 parâmetro1, tipo2 parâmetro2, ...) { // aqui é colocado o corpo do método } Cada parâmetro pode ser: – um valor, – uma variável ou – uma expressão que representam um tipo primitivo, um array ou uma classe. O tipo de retorno pode ser: – qualquer tipo primitivo (int, long, float, ...) – qualquer classe (String, …) – void, para o caso de não retornar nada (procedimento). Orientação a Objetos em Java Passagem de Parâmetro public class DeclaracaoDeMetodos { // declarando um método que representa uma função… public static int soma ( int a , int b ) { Observe os int s = a + b; tipos de retorno return s; } // declarando um método que representa um procedimento… public static void imprimir ( int a ) { System.out.println ( a ); } } 10 Orientação a Objetos em Java Passagem de Parâmetro public class DeclaracaoDeMetodos { // declarando um método que representa uma função… public static int soma ( int a , int b ) { int s = a + b; return s; } public static void main (String [] args) { int c = soma(5, 20); System.out.println ( soma(c, 10) ); } } Orientação a Objetos em Java Passagem de Parâmetro public class DeclaracaoDeMetodos { // declarando um método que representa um procedimento… public static void imprimir ( int a ) { System.out.println ( a ); } public static void main (String [] args) { int c = 10; imprimir(c); imprimir(20); imprimir(c+20); } } 11 Orientação a Objetos em Java Passagem de Parâmetro O número de parâmetros passados deve ser igual ao da definição. Cada parâmetro individualmente, deve ter tipo compatível ao da definição. Em Java, todos os parâmetros são passados por valor, isto significa que o valor (e não o endereço) da variável é passado. Assim, as modificações no parâmetro formal (dentro do método) não afetam o parâmetro real (valor externo). Cada chamada a um método cria suas próprias instâncias dos parâmetros formais. Uma expressão pode ser usada como argumento. Orientação a Objetos em Java 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). 12 Orientação a Objetos em Java Passagem de Parâmetro - 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); } } Orientação a Objetos em Java Passagem de Parâmetro - Exemplo 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); } } 13 Orientação a Objetos em Java Passagem de Parâmetro Como já foi visto anteriormente, a passagem de parâmetros de tipos primitivos em Java é feita por valor, ou seja, uma cópia do valor original é feita. Isso significa que modificações no parâmetro formal não são refletidas no parâmetro real. Para arrays, uma cópia da referência para o array é passada. Para objetos, uma cópia da referência ao objeto é passada, e não uma cópia do objeto. Orientação a Objetos em Java Passagem de Parâmetros com Arrays Para arrays, uma cópia da referência para o array é passada, assim, as mudanças no seus elementos dentro de um método, se refletem no lugar onde o método foi chamado. 14 Orientação a Objetos em Java Passagem de Parâmetros com Arrays public static void somar(int[] x) { x[2] = x[1] + x[0]; } public static void main (String args[]) { int[] a = new int[3]; a[0] = 1; a[1] = 10; a[2] = 20; System.out.println(“antes >”+ a[2]); somar(a); System.out.println(“depois >”+ a[2]); } antes >20 depois >11 Orientação a Objetos em Java Parâmetros também podem ser passados para um programa. Eles são acessíveis no método main() como um array de String. public class Classe { public void main(String args[]) { for (int i=0; i<args.length; i++) { System.out.println( “>“ + i + “ = “ + args[i] ); } } } em uma chamada do tipo: java Classe abc xyz,sdf uuu o resultado do programa será: > 0 = abc > 1 = xyz,sdf > 2 = uuu 15 Orientação a Objetos em Java 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; Orientação a Objetos em Java Exemplo de Aliasing 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.getSaldo()); } } 16 Orientação a Objetos em Java Aliasing como Conseqüência de uma Atribuição Atribuição de um identificador de objeto a um outro de mesmo tipo é permitida, 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.getSaldo()); ... Orientação a Objetos em Java Passagem por Referência 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.getNumero() + c.getSaldo()); // 100 } } 17 Orientação a Objetos em Java A Classe Banco - Operações • • • • • • • Cadastro de uma nova conta Remover uma conta Localizar (procurar) uma conta Efetuar Crédito Efetuar Débito Consultar Saldo Transferência entre contas Orientação a Objetos em Java A Classe Banco - Descrição class Banco { private Conta[] contas; private int indice; Banco(int numContas) { this.contas = new Conta[numContas]; indice = 0; } 18 Orientação a Objetos em Java A Classe Banco - Descrição class Banco { private Conta[] private int contas; indice; void cadastrarConta(String num) { if (indice<contas.length){ Conta c = new Conta(num); contas[indice] = c; indice = indice + 1; } else System.out.println(“Banco Lotado!!!”); } Orientação a Objetos em Java A Classe Banco - Descrição private Conta procurarConta(String n) { int i = 0; boolean achou = false; while ((! achou) && (i < indice)) { if (contas[i].getNumero().equals(n)) achou = true; else i = i + 1; } if (achou) return contas[i]; else return null; } 19 Orientação a Objetos em Java A Classe Banco - Descrição void efetuarDebito(String num, double val) { Conta c; c = procurarConta(num); if (c != null) c.debito(val); else System.out.println("Conta inexistente!"); } A operação credito é similar Orientação a Objetos em Java A Classe Banco - Descrição private void removerConta(String n) { int i = 0; boolean achou = false; while ((! achou) && (i < indice)) { if (contas[i].getNumero().equals(n)) achou = true; else i = i + 1; } if (achou) { contas[i] = contas[indice-1]; indice--; } else System.out.println(“Conta Inexistente”); } 20 Orientação a Objetos em Java Camada de Negócio Camada de Coleção Cam. de Apresentação (Interface com o Usuário) Orientação a Objetos em Java Camadas 21 “Quando todos concordam comigo eu sempre sinto que estou errado.” Oscar Wilde Orientação a Objetos em Java 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. 22 Orientação a Objetos em Java 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. Orientação a Objetos em Java 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. 23