Programação Orientada a Objetos* Campos e Métodos Estáticos Prof. Isabel Cafezeiro [email protected] http://www.dcc.ic.uff.br/~isabel *Baseado no livro Introdução à Programação Orientada a Objetos usando JAVA – Rafael Santos – Editora Campus – Série SBC Campos e métodos estáticos Campos estáticos: Campos compartilhados por todas as instâncias de uma classe Métodos estáticos: Métodos que podem ser executados sem que instâncias da classe sejam criadas Campos estáticos Campos estáticos (campos de classe) Somente um valor é armazenado em um campo estático. A alteração deste valor por qualquer instância afeta todas as outras instâncias da classe. Campos estáticos pclasse DataCons dia: 4 psuper mês: 5 DataCons( ...) ano: 2006 DataCons( ...) ... ... hoje amanhã pclasse retornaDia( ) dia: 4 ... mês: 5 ano: 2006 campos estáticos aqui !!! Campos estáticos Exemplo: c1 c1 c2 c3 c4 c2 c3 c4 c5 c5 Banco com múltiplas filas Banco com fila única Campos estáticos class SimuladorDeCaixaDeBanco0 { private int númeroDoCliente; private int númeroDoCaixa; Exemplo: Caixa de banco SimuladorDeCaixaDeBanco0(int n) { númeroDoCaixa = n; númeroDoCliente = 0; System.out.println("Caixa "+númeroDoCaixa+" iniciou operação."); } // fim do construtor public void próximoAtendimento() { númeroDoCliente = númeroDoCliente + 1; System.out.print("Cliente com a senha número "+númeroDoCliente+", favor "); System.out.println("dirigir-se ao caixa número "+númeroDoCaixa+"."); } } // fim da classe SimuladorDeCaixaDeBanco0 SimuladorDeCaixaDeBanco0.java Campos estáticos class DemoSimuladorDeCaixaDeBanco0 Exemplo: Caixa { public static void main(String[] argumentos) banco { SimuladorDeCaixaDeBanco0 c1 = new SimuladorDeCaixaDeBanco0(1); .... SimuladorDeCaixaDeBanco0 c5 = new SimuladorDeCaixaDeBanco0(5); c1.próximoAtendimento(); c2.próximoAtendimento(); c2.próximoAtendimento(); c4.próximoAtendimento(); c5.próximoAtendimento(); c3.próximoAtendimento(); c5.próximoAtendimento(); c2.próximoAtendimento(); c1 c2 c3 c4 c5 1 1 2 3 1 1 1 2 de A alteração da senha é local à instância: não afeta as outras instâncias !!!! } // fim do método main } // fim da classe DemoSimuladorDeCaixaDeBanco0 DemoSimuladorDeCaixaDeBanco0.java Campos estáticos Utilizar contador de senha no main: solução ruim: A cargo do programador usuário!!! Não assegura o uso correto !!! class DemoSimuladorDeCaixaDeBanco01 { public static void main(String[] argumentos) { int senha = 0; SimuladorDeCaixaDeBanco0 c1 = new SimuladorDeCaixaDeBanco0(1); ... SimuladorDeCaixaDeBanco0 c5 = new SimuladorDeCaixaDeBanco0(5); senha = c1.próximoAtendimento(senha); .... senha = c2.próximoAtendimento(senha); } // fim do método main } // fim da classe DemoSimuladorDeCaixaDeBanco01 Sobrecarregar o método próximoAtendimento() na classe SimuladorDeCaixaDeBanco0 DemoSimuladorDeCaixaDeBanco01.java Campos estáticos Utilizar campos estáticos: class SimuladorDeCaixaDeBanco { static private int númeroDoCliente = 0; private int númeroDoCaixa; para poder iniciar e atender SimuladorDeCaixaDeBanco(int n) em qualquer ordem { númeroDoCaixa = n; // númeroDoCliente = 0; System.out.println("Caixa "+númeroDoCaixa+" iniciou operação."); } // fim do construtor public void próximoAtendimento() { númeroDoCliente = númeroDoCliente + 1; System.out.print("Cliente com a senha número "+númeroDoCliente+", favor "); System.out.println("dirigir-se ao caixa número "+númeroDoCaixa+"."); } } // fim da classe SimuladorDeCaixaDeBanco SimuladorDeCaixaDeBanco.java Campos estáticos Outro uso de campos estáticos: declaração de constantes final static public double raizDe2 = 1.4142135623730950488; impede a modificação do valor do campo Campos estáticos Exercício: 1. 2. 3. 4. 5. Acrescentar à classe DataCons um contador de instâncias que informe quantas datas foram criadas. Acrescentar à classe DataCons um método que informe quantas datas foram criadas. Chamar a nova classe de DataCont. Implementar a classe que testa DataCont. Nomear a nova classe DemoDataCont. Testar. Campos estáticos Exercício: Atenção: datas criadas datas existentes Para fazer um contador de datas existentes seria necessário subtrair as datas destruídas pelo coletor de lixo. O método finalize(), que é efetuado sempre que o coletor de lixo elimina uma instância poderia ser utilizado com este propósito: protected void finalize() { cont = cont-1; } Observação: não há como garantir a execução do coletor de lixo, mesmo quando invocado explicitamente. System.gc(); Métodos estáticos Métodos estáticos (métodos de classe) Podem ser executados sem que instâncias da classe sejam criadas main Métodos independentes dos campos da classe: só necessitam dos parâmetros para serem utilizados. Métodos que funcionam sempre da mesma forma, mesmo quando aplicados à instâncias diferentes. Métodos estáticos class ConversaoDeUnidadesDeComprimento { public static double polegadasParaCentímetros(double polegadas) { double centímetros = polegadas*2.54; return centímetros; } public static double pésParaCentímetros(double pés) { double centímetros = pés*30.48; return centímetros; } public static double milhasParaQuilômetros(double milhas) { double quilômetros = milhas*1.609; return quilômetros; } } // fim da classe ConversaoDeUnidadesDeComprimento ConversaoDeUnidadesDeComprimento Métodos estáticos class DemoConversaoDeUnidadesDeComprimento { public static void main(String[] argumentos) { ConversaoDeUnidadesDeComprimento conv = new ConversaoDeUnidadesDeComprimento(); System.out.println("vinte pés: "+conv.pésParaCentímetros(20)+" centímetros"); System.out.println("cinco polegadas;"+conv.polegadasParaCentímetros(5)+" centímetros"); System.out.println("vinte pés :"+ ConversaoDeUnidadesDeComprimento.pésParaCentímetros(20)+ " centímetros"); System.out.println("cinco polegadas:"+ ConversaoDeUnidadesDeComprimento.polegadasParaCentímetros(5)+ " centímetros"); } // fim do método main } // fim da classe DemoConversaoDeUnidadesDeComprimento DemoConversaoDeUnidadesDeComprimento Métodos estáticos Observações sobre o método main: A classe que contém o método main pode conter outros métodos, que podem ser chamados pelo main. Evitar repetição de código Efetuar tarefas particulares simplificar o código do main Métodos chamados a partir do main devem ser obrigatoriamente estáticos!!! Campos da classe acessados pelo main devem ser obrigatoriamente estáticos!!! Métodos estáticos Observações sobre o método main: O método main pode ser chamado por outros métodos: uma aplicação inteira pode ser parte componente de outra aplicação. class DemoChamadaAoMain { public static void main(String[] argumentos) { ... DemoConversaoDeUnidadesDeComprimento.main(argumentos); .... } // fim do método main } // fim da classe DemoChamadaAoMain Métodos estáticos Fábrica de instâncias: são métodos que criam e retornam instâncias da própria classe. class DataComFábrica { .... public static DataComFábrica Natal(Short ano) { return new DataComFábrica ((byte) 25,(byte)12,ano); } // fim do método Natal } // fim da classe DataComFábrica Campos estáticos Exercício: 1. 2. 3. Fazer o contador de instâncias da classe de DataCont ser campo estático. Modificar DemoDataCont para invocar o método que informa a quantidade de datas criadas de maneira independente de instâncias. Testar.