Uso de Orientação a Objetos em Java Objetos e Mensagens Objetos em Java Principais classes Containers 1 Um pouco de história... ν Variáveis como elementos isolados υ ν int dia, mes, ano; Fácil compreensão, porém duas principais desvantagens: υ υ Várias declarações: Φ int meuDiaNascimento, meuMesNascimento, meuAnoNascimento; Φ int seuDiaNascimento, seuMesNascimento, seuAnoNascimento; Variáveis independentes, sem relação: Φ ν Em nível conceitual, tudo faz parte de uma data. Para isto, há os tipos agregados de dados (estruturados ou de registro). 1 Tipos agregados de dados ν Exemplo Pascal: Data = record dia, mes, ano: integer; end; ν Em Java: public class Data { int dia; int mes; int ano; } Data meuNascimento, seuNascimento; υ Mais tarde, usa-se: seuNascimento.dia = 26; seuNascimento.mes = 11; seuNascimento.ano = 1960; 1 Objetos e Classes ν Classe com seus atributos (Data com dia, mês e ano) ν Objeto é uma instância da classe (meuNascimento) ν Porém, ainda há que se definir métodos, pois como está qualquer valor inteiro pode ser atribuído às variáveis membro (atributos). 1 Criação de um objeto ν Declaração não cria objeto, diferentemente dos tipos primitivos ν Para criar efetivamente, deve-se instanciá-lo. Data meuNascimento; meuNascimento = new Data(); 1 Criação de um objeto (continuação) ν O espaço real de memória alocado com new é o objeto efetivamente. 1 Características dos Objetos ν ν Os objetos não são acessados diretamente υ são acessados por meio de um manipulador (handle), através do qual lhe são enviadas mensagens. υ Ex.: lulu = new Cachorro(); // lulu é o handle do novo objeto Os objetos existem à parte do fluxo do programa υ estão todos na heap (alocados dinamicamente) υ não tem tempo de vida determinado pelo programador υ não tem escopo, na verdade, são todos visíveis a partir de um manipulador que tem escopo e tempo de vida υ quando não existem mais referências para um objeto ele é automaticamente retirado da memória (garbage collection) 1 Utilização de Objetos em Java ν Declaração do handle Φ υ Ex.: Φ ν tipo nomeHandle; Date hoje; Instanciação υ Associação do handle a um novo objeto Φ υ nomeHandle = new ConstructorDaClasse(); Associação do handle a um objeto que já existe Φ nomeHandle = outroHandle; 1 Exemplo de uso de objetos ... Date hoje; hoje = new Date(); // cria uma instância da classe Data // a data de hoje, // sendo ‘hoje’ o handle deste objeto Date aniv = new Date(1997, 5, 30); // construtor hipotético Date aniv2; aniv2 = aniv; // aniv e aniv2 são handles para o // mesmo objeto if (hoje.after(aniv) { // envio da mensagem after, // já passou do aniv // com parâmetro, para o objeto // hoje } 1 Classes Básicas x Tipos Primitivos ν Variáveis (par: posição memória + valor) int a = 10; // a é um tipo primitivo, // não pode receber mensagens, ex.: a.inc() ν Objetos Integer b = new Integer(10); // b é um handle de objeto int c = b.intValue(); ν ν Tipos primitivos ficam na stack (mundo do programa) Objetos ficam na heap (mundo dos objetos) 1 Containers Matrizes ArrayList HashMap 1 Matrizes ν Declaração tipo[] nome; // cria a variável, mas não aloca memória nome = new tipo[tamanho]; // aloca memória υ Obs.: A alocação de memória é feita em tempo de execução, logo, o tamanho das matrizes pode ser calculado durante a execução do programa. ν Exemplo char[] m = new char[200]; ν Inicialização int[] a = { 1, 2, 3, 4, 5}; int[][] b = { {1,2,3} {4,5,6} }; 1 Exemplo: matrizes // declaração de duas matrizes int[] vetInt1 = { 1, 3, 5, 7, 9, 11 }; int[] vetInt2 = new int[vetInt1.length * 2]; // loop de inicialização for( int i=0; i < vetInt1.length; i++) { vetInt2[i*2] = vetInt1[i]; vetInt2[i*2+1] = vetInt1[i] + 1; } // loop de impressão for( int i=0; i < vetInt2.length; i++) System.out.println(vetInt2[i]); 1 A classe ArrayList ν ν ν ArrayList é um array que pode mudar de tamanho depois de sua criação (+- lista dinamicamente encadeada) Assim como no array, os objetos são recuperados pela sua posição Principais métodos υ add(Objeto) υ get(posição) υ remove(Objeto) υ int size() υ int indexOf(Objeto) import java.util.*; ... ArrayList valores = new ArrayList(); valores.add (“uma casa”); valores.add (“está limpa”); for (int i=0; i < valores.size(); i++) { System.out.println( valores.get(i)); } Collections.sort(valores); // Exerc: repetir a impressão 1 A classe HashMap ν É um container que armazena os objetos na forma de tabelas Hash. Φ Φ Rápido acesso para consulta (não é uma estrutura seqüencial) Os objetos são recuperados por meio de uma chave de acesso • Para cada objeto há uma chave de entrada na tabela (método hashValue determina o ponto de entrada - a classe Object implementa este método, que pode ser sobre-escrito) Φ ν Os objetos não tem uma ordem Principais métodos Φ Φ Φ Φ Φ Object put(ObjetoChave, Objeto) Object get(ObjetoChave) boolean containsValue(Objeto) Object remove(ObjectoChave) int size() 1 ExemploHash HashMap dados = new HashMap(); ... do { cod = teclado.readLine(); if (! cod.equalsIgnoreCase("fim")) { nome = teclado.readLine(); dados.put(cod,nome); } } while (! cod.equalsIgnoreCase("fim")); do { cod = teclado.readLine(); nome = (String)dados.get(cod); if (nome != null) System.out.println(nome); } while (! cod.equalsIgnoreCase("fim")); 1 Exercícios ν Ler dois arrays de 10 números reais (A e B) e Φ Φ Φ ν ν calcular S = (A[1] * B[10]) + (A[2] * B[9]) + ... calcular C, sendo C[i] = A[i] / B[i], e imprimi-lo invertido imprimir os números pares de A (considerando a parte inteira dos números) Fazer um programa que leia várias linhas (até ser digitado fim) e as imprima na ordem inversa da digitação Fazer um programa que leia o número da conta corrente de clientes e seus nomes. Depois, para cada número digitado, imprima o nome do correntista. 1 Resumo ν ν ν ν ν Integer a = new Integer(“10”) int b = a.intValue() + 2; String x StringBuffer String[] vs = new String[10] vs[3] = “teste” ArrayList al = new ArrayList() Float f = (Float)al.get(2) Iterator i = al.iterator() i.next(); i.next() Float f = (Float) i.next(); ν ν ν Quando usar matriz, ArrayList ou HashMap? Existem outros containers no pacote java? Pode-se definir novos containers baseados nos existentes? 1