Fundamentos em Java Métodos Estáticos Pacotes Manipulação de Data e Hora Professor: Armando Hage Métodos e Campos Static(estáticos) As classes podem ter tanto campos estáticos quanto métodos estáticos. Os campos estáticos não mudam de uma instância de classe e outra,nem os métodos estáticos de uma classe operam em uma instância. Os métodos static só podem ser chamar outros métodos static diretamente e não podem se referir a this ou super de nenhuma maneira. Declarando uma variável static, você estará criando uma variável global. Ex.: Métodos: double x = Console.readDouble(); double x = Math.pow(3,0.1); Campos:Math.PI System.out Pacotes São recipientes para classes usados com a finalidade de manter o espaço do nome de classe compartimentalizado. Os pacotes são armazenados de maneira hierárquica e são importados explicitamente para novas definições de classe. São convenientes para organizar o trabalho e separá-lo de bibliotecas outras bibliotecas. A biblioteca padrão Java é distribuída em inúmeros pacotes.Ex.: java.lang, java.util,java.net, e vários outros. Um motivo para se usar pacotes é garantir e exclusividade dos nomes dos pacotes. Pacotes As classe públicas de um pacote podem ser acessadas de duas maneiras.Fornecendo o nome completo do pacote. Java.util.Date d =new Date() Usando a palavra import para referenciar a classe do pacote sem informar nomes completos. import java.util.Date; Date d=new Date(); Pode-se importar um pacote inteiro usando-se o *. import java.util.*; Definindo um Pacote package NomeDoModulo; Indica ao compilador que as classes declaradas no arquivo pertencem ao módulo NomeDoModulo. As classes de um módulo podem ser declaradas em mais de um arquivo. Todas as classes (arquivos “.class”) de um pacote devem estar agrupadas em um diretório com mesmo nome do módulo. Importando classes de um pacote... import NomeDoPacote.NomeDaClasse import NomeDoPacote.* Exemplos em Java int i = corejava.Console.readInt(); java.util.GregorianCalendar hoje = new java.util.GregorianCalendar; Forma mais simples: import corejava.*; import java.util.*; import java.corejava.Console; É mais simples importar todas as classe de um pacote. Não ocorre perda de tempo na compilação ou aumento no tamanho do arquivo. Criando um Pacote Desenvolva uma classe chamada Console.java que deverá pertencer a um pacote chamado package console, responsável pela entrada de dados via cia console. Crie um novo pacote chamado meupacote, contendo três classes(Ponto.java,Equacao.java,Triangulo.java), contendo as definições de atributos e métodos de cada uma das classe. Faça uma classe que acesse as classe contidas em cada uma dos pacotes. package Console;//Definição de um pacote Exemplo import java.io.*; import java.lang.*; public final class Console{ //Le somente valores reais public static double leDouble(){ try{BufferedReader entra=new BufferedReader(new InputStreamReader(System.in)); String s = entra.readLine(); return Double.parseDouble(s); }catch(IOException e){ System.out.println("Erro na entrada"); ... Exemplo (Ponto.java) package geo; public class Ponto {float x,y; public Ponto(float ax,float ay) {this.x=ax;this.y=ay; } public float retornaX ...... package geo; import java.io.*; public class Equacao{ double a,b,c; //Construtor default Equacao(){} //Construtor e seus parametros package geo; Equacao(double a,double b,double c){ import java.io.*; this.a=a;this.b=b;this.c=c; import console.*; } public class Triangulo{ ..... double base,altura;double area; public Triangulo(){}... Exemplo import java.io.*; import java.lang.*; import console.*; import geo.*; public class Principal{ public static void main(String args[])throws IOException{ String continua="SIM"; int escolha; while(continua.equals("SIM")){ Como o compilador Localiza os Pacotes O compilador JDK e a maioria dos outros compiladores Java armazenam os pacotes em subdiretórios do sistema de arquivos ou dentro de arquivos compactados com ZIPs ou JARs. O caminho para se chegar a um pacote e através da variável de ambiente CLASSPATH. Ex.:Cria um caminho: c:\armando\meuspacotes. Com os fontes (Ponto.java, Equacao.java, Triangulo.java e Principal.java), no diretório c:\fontes. Já a classe Console poderia ficar em c:\console. Como o compilador Localiza os Pacotes Para criar o pacote: c:\console\javac –d c:\armando\meuspacotes Console.java c:\fontes\javac –d c:\armando\meuspacotes Ponto.java c:\fontes\javac –d c:\armando\meuspacotes Equacao.java c:\fontes\javac –d c:\armando\meuspacotes Triangulo.java Com isso os arquivos (Ponto.class, Equacao.class e Triangulo.class) serão direcionados para: c:\armando\meuspacotes\geo. O arquivo Console.class será criado em c:\armando\meuspacotes\console classpath=c:\armando\meuspacotes\geo; Em c:\fontes, compilar e executar Principal.java Se estiver utilizando uma ferramenta com JBuilder ou SunOne Studio 4 tudo que é criado automaticamente é definido como um pacote. Escopo de um pacote public private Recursos marcados desta forma podem ser utilizados por qualquer classe,sendo ou não do mesmo pacote.Os atributos marcados desta forma são herdados e podem ser acessados pelas subclasses. Visível apenas pelos métodos da classe que o criou.Não são acessados diretamente por uma subclasse, a não ser indiretamente por um método não-privado. proteced São visíveis na própria classe, em todas as subclasses e também nas classes que pertencem ao mesmo pacote. Escopo de um pacote package São visíveis na própria classe e por classes definidas no mesmo pacote.Subclasses de classes em outros pacotes não podem acessar estes recursos.Classes pertencentes ao mesmo pacote colaboram para atingir um objetivo, logo devem conhecer os recursos das outras. Utilização Use public para métodos que devem ser visíveis por clientes da classe. Use protected para recursos que podem ser interessantes para quem quer criar subclasses em outros pacotes. Recomendação para Projeto de Classes Sempre mantenha os dados privados Caso não seja obedecido, violará o encapsulamento. Quando os dados são mantidos privados, as alterações em suas representações não afetam o usuário da classe e o erros são bem mais fáceis de detectar. Sempre inicialize os dados Java não inicializa variáveis locais automaticamente. Não use tipo básicos em demasia numa classe A idéia é substituir os usos relacionados de tipos de dados básicos por outras classes. Ex.:Em uma classe Cliente os campos: private String rua; private String cidade; private String estado; private int cep; Estes campos poderiam forma a classe Endereco. Recomendação para Projeto de Classes Nem todos os campos precisam de acessadores e modificadores de campos individuais. Use a forma padrão de construção de classes Sempre listamos o conteúdo das classes na seguinte ordem Recursos públicos Recursos de escopo de pacote Recursos privados Dentro de cada seção: Constantes,construtores, métodos estáticos,variáveis de instância, variáveis estáticas. Recomendação para Projeto de Classes Divida as classe com muitas tarefas Divida uma classe complicada em duas conceitualmente simples. Dê nomes às classes e métodos que representam suas tarefas Assim como as variáveis devem ter nomes representativos, as classes também devem seguir esta metodologia. O nome da classe deve ser um substantivo(Pedido,Cliente) ou substantivo junto a um adjetivo(PedidoExpresso,EnderecoCobranca). Com os métodos,siga a convenção dos métodos “acessadores” inicados por get(getDia,getSaldo) e “modificadores” iniciados por set(setSalario,setSaldo) Manipulação de Datas e Hora A manipulação de data e hora exige a utilização de uma classe externa da linguagem Java(Date). Exige a utilização da diretiva import. As diretivas import devem ser inseridas antes da declaração do nome da classe. Sintaxe: import nome-do-pacote ou classe Por exemplo se fosse necessário utilizar o pacote externo Date, a diretiva seria: import java.util.Date, possibilitando a criação de diversos objetos para a manipulação de data e hora. Ex.: Date data; ou Date data=new Date(); data = new Date; Métodos para a Manipulação da Data A classe Date fornece muitos métodos úteis para a obtenção e tratamento com datas e horas. Ex.: Date data=new Date(); data.getDate() – Retorna o dia do mês(1-31) armazenado no objeto data. data.getDay() – Retorna o dia da semana. data.getMonth() – Retorna o mês. data.getYear() – Retorna o ano de armazenamento no objeto data.Retorna os dois últimos algarismos referentes ao ano. Datas superiores a 2000 retornam três digitos.Ex.:2000 – 100 , 2001- 101 data.setDate(dia)- difine o dia do mês para dia do objeto. data.setMonth(mês) – Define o mês para o mês do objeto data. data.setYear(ano)- Define o ano para o ano do objeto data. data.toGMTString()-Retorna uma string representando o objeto data com GMT, isto é, com a data e hora de Londres. Métodos para a Manipulação da Hora Da mesma forma existem métodos para obtenção e tratamento de horas.Ex.: Date data=new Date(“October 23,2001,10:42:15”); data.getHours()- Retorna a hora(0-23) do objeto data. data.getMinutes()-Retorna os minutos(0-59) do objeto data. data.getSeconds()-Retorna os segundos(0-59)do objetos data. data.getTime()-Retorna o número de milissegundos decorridos desde 1º de janeiro de 1970,00:00:00.Esse método é geralmente usado para realizar cálculos entre datas. data.getTimezoneoffset()-Retorna a diferença em minutos da hora local em GMT. data.parse(string)-Analisa a string e retorna o número Métodos para a Manipulação da Hora data.setHours(horas)-Define a hora do objeto data. data.setMinutes(minutos)-Define os minutos do objeto data. data.setSeconds(segundos)-Define os segundos do objetos data. data.setTime(valor)-Define a hora para valor,que representa o número de milissegundos decorridos desde 1º de janeiro de 1970,00:00:00. data.toLocalString()-Retorna uma string contendo a data e hora do objeto data,levando em conta o fuso horário corrente. import java.util.Date; public class objdata{ public static void main(String args[]){ Date dt = new Date(); System.out.println("Hoje e " + dt.toString()); System.out.println("O ano e " + dt.getYear()); System.out.println("O mês e " + dt.getMonth()); System.out.println("O dia e " + dt.getDate()); System.out.println("\n Mudança de dia "); dt = new Date(1997,11,25); System.out.println("Hoje e " + dt.toString()); System.out.println("O ano e " + dt.getYear()); System.out.println("O mês e " + dt.getMonth()); System.out.println("O dia e " + dt.getDate()); } } Exemplo Exemplo import java.util.Date; //importa a classe Date class Saudacao{ public static void main (String args[ ]) { Date data = new Date(); // cria e inicializa um objeto data int hora=0,min=0,sec=0; hora=data.getHours(); min=data.getMinutes(); sec=data.getSeconds(); System.out.println("Agora são " + hora + "h:" + min + "m:" + sec + "s"); if(hora>=0 && hora<6) System.out.println("Boa Madrugada!"); if(hora>=6 && hora<12) System.out.println("Bom Dia!"); if(hora>=12 && hora<18) System.out.println("Boa Tarde!"); if(hora>=18) System.out.println("Boa Noite!"); } } Exercício Crie um programa que simule promoções em um site de internet.A cada dia da semana ele mostra uma promoção diferente.Por exemplo: se for Domingo-Carro 0Km agora com 10% de desconto, se for Segunda-Aproveite a promoção de laranjas e assim por diante. Crie um programa que mostre na tela o dia atual no formato,Ex.: Hoje é Sexta-feira, dia 07 de Dezembro de 2002.Você pode utilizar uma estrutura if ou switch-case. Crie um pacote para suas classes criadas.