Pacotes, Classes Básicas, Acessibilidade Carlos Bazilio Depto de Ciência e Tecnologia Pólo Universitário de Rio das Ostras Universidade Federal Fluminense Organização das Classes ● ● ● Como podemos organizar nossas classes e interfaces de forma mais lógica? Por exemplo, como separar classes que acessam uma base de dados das classes que preparam uma interface com o usuário? Em Java, fazemos isso com o uso de pacotes Sintaxe de Pacotes // Arquivo ClienteConta.java package contas; public class ClienteConta { … } // Arquivo ClienteCC.java package contas; public class ClienteCC extends ClienteConta { … } // Arquivo ClientePoupanca.java package contas; public class ClientePoupanca extends ClienteConta { … } Pacotes // Arquivo ClienteConta.java package contas; public class ClienteConta { … } ● ● Para a máquina virtual de Java, a classe ClienteConta passa a ser referenciada como contas.ClienteConta Ou seja, o pacote funciona com um espaço de nomes (namespaces) para a identificação de uma classe Pacotes ● Num ambiente de aplicações integrado, de forma a facilitar a identificação de classes, os pacotes costumam ter lei de formação inversa das urls: ● ● <codigo-pais>.<codigoatividade>.<entidade>.<setor>... Ex.: br.com.sirius.gerspool Pacotes também podem ser aninhados Fisicamente (sistema de arquivos), pacotes são manipulados como diretórios Acesso a outros Pacotes ● Uma classe declarada num pacote pode acessar a classe de outro de 2 formas básicas: 1ª. Através do comando import // Arquivo ClienteConta.java package contabasica; public class ClienteConta { … } // Arquivo ClienteCC.java package contas; import contabasica.ClienteConta; public class ClienteCC extends ClienteConta { … } Acesso a outros Pacotes ● Uma classe declarada num pacote pode acessar a classe de outro de 2 formas básicas: 2ª. Colocando a referência completa à classe // Arquivo ClienteConta.java package contabasica; public class ClienteConta { … } // Arquivo ClienteCC.java package contas; public class ClienteCC extends contabasica.ClienteConta { … } Acesso a outros Pacotes ● ● ● Um arquivo pode importar quantas classes forem necessárias O 2 métodos de referência a pacotes externos podem ser combinados Uma variante do import (import <nomepacote>.*) permite que todas as classes deste pacote sejam importadas P. ex.: import contabasica.*; Acesso a outros Pacotes ● ● ● Para o caso de classes homônimas, a distinção pode ser feita pelo uso do nome completo da classe Por exemplo, os pacotes java.util e java.sql possuem uma classe chamada Date Para diferenciarmos, basta colocarmos o nome completo da classe (prefixá-la com o nome do pacote) Importação Estática ● ● ● À partir da versão 5 (JDK 5.0 http://en.wikipedia.org/wiki/Java_version_histor y), o import foi aprimorado para permitir importação estática Por exemplo, se precisamos construir uma equação matemática, como: Math.sqrt(Math.pow(x,2) + Math.pow(y,2)) Podemos reescrevê-la da seguinte forma: import static java.lang.Math.*; ... sqrt(pow(x,2) + pow(y,2)) ... Visibilidade de Acesso ● Java possui 4 possíveis formas de definição de visibilidade de acesso a recursos (atributos e métodos): public: acesso permitido a método localizado em qualquer classe protected: acesso permitido a método localizado na classe onde o recurso ocorre, nas especializações e no mesmo pacote private: acesso permitido a método localizado apenas na classe onde o recurso ocorre default (implícito): acesso permitido a método localizado no mesmo pacote do recurso Visibilidade de Acesso Access Levels Modifier ● Class Package Subclass World public Y Y Y Y protected Y Y Y N no modifier Y Y N N private Y N N N http://java.sun.com/docs/books/tutorial/java/javaOO/accesscont rol.html Visibilidade de Acesso ● ● A definição da visibilidade de acesso permite que encapsulemos a estrutura de nossas classes Com isso, conseguimos garantir a manipulação correta de elementos chave da nossa aplicação Visibilidade de Acesso public class ClienteBanco { private String nome; private int conta; private float saldo; public void RealizaSaque (float s) { if (s < this.saldo) this.saldo = this.saldo – s; } public class Principal { } public static void main (String arg[]) { ClienteBanco cliente1; cliente1 = new ClienteBanco (“eu”, 0001, 500); cliente1.saldo = cliente1.saldo – 100; cliente1.RealizaSaque(100); } } Biblioteca de Java ● A linguagem Java possui uma biblioteca extensa de classes organizadas em pacotes: java.lang: contém classes da definição básica da linguagem (String, Math, System, ... http://java.sun.com/javase/6/docs/api/java/lang/packagesummary.html), portanto, não precisa ser importado java.util: contém classes úteis para construção de aplicações diversas (classes de coleções – pilhas, filas, conjuntos, ... – classes para manipulação de datas, horas, ... – http://java.sun.com/javase/6/docs/api/java/util/packagesummary.html) java.io: contém classes para manipulação de entrada e saída (http://java.sun.com/javase/6/docs/api/java/io/packagesummary.html) Biblioteca de Java ● A linguagem Java possui uma biblioteca extensa de classes organizadas em pacotes: java.net: implementação de aplicações de acesso à rede (http://java.sun.com/javase/6/docs/api/java/net/packagesummary.html) java.sql: classes para manipulação de bancos de dados javax.sql: extensão para manipulação de bancos no lado do servidor (http://java.sun.com/javase/6/docs/technotes/guides/jdbc/ind ex.html) etc ... (http://java.sun.com/javase/6/docs/api/index.html) Exercício ● Implementação do método extrato utilizando alguma coleção para armazenar as operações e data/hora para indicar o momento da operação Dica: classes disponíveis no pacote java.util