campos estáticos aqui

Propaganda
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.
Download