Amigo dá uma olhada no que eu fiz!
Eu estudo assim, pego livros, tutoriais, etc.. .junto tudo e monto um exemplo bem legal.
/* Quando e porquê usar static?
* static é uma das palavras-chave do Java, e é também motivo de muita confusão
* e dúvidas entre o pessoal que esta começando(eu). Aliás, mesmo os mais experientes
* confundem-se às vezes em usar ela. O método static mais famoso de todos é o main.
* É através dele que vimos nosso primeiro programa em Java nascer, e é sempre via
* main que nossos programas criam vida. Por definição da linguagem Java, o método
* main precisa necessariamente ter acesso public, ser static, não retornar coisa
* alguma ( void ) e receber como argumento um array de String (String args[]).
*
* Como regra geral, tenha isso em mente: dentro de métodos static somente é
* possível pode acessar outros métodos e variáveis que também sejam static.
* Dentro do método pode-se definir qualquer tipo de variável, static ou não.
* Caso seja necessário acessar algum método ou membro não-static, é necessário
* criar uma instância da classe e então chamar o que quiser. Já o contrario é
* um pouco diferente: dentro de membros não-static, é possível acessar tanto
* propriedades static quanto as não-static.
*
* O fato de ser preciso primeiramente criar uma instância da classe para só
* então chamar algum método não-static ou acessar uma variável comum dentro de
* um método static deve-se ao fato que dentro dele não existe uma referência
* para o ponteiro this. O ponteiro this é utilizado para referenciar
* propriedades da classe em que estamos trabalhando.
*
* Ao contrário do que o nome soa, static não significa que a variável ou método
* sera estática do ponto de vista que seu valor não pode mudar ( final é usado
* para estes casos ). static nos garante que somente haverá uma, e não mais que
* uma, referência para determinada variável ou método disponível em mémoria.
* Em outras palavras, declarando alguma coisa como static, todas as instâncias
* da classe irão compartilhar a mesma cópia da variável ou método.
*
* Declarar algo como static também permite você acessar as coisas diretamente,
* ou seja, sem precisar criar uma instância da classe. Existe inclusive um
* Design Patter baseado no uso de static: Singleton.
*/
class StaticTemporaria {
public static int contador_static = 0;
public int contador_normal = 0;
public StaticTemporaria() {}
public static void incrementaStatic(){
contador_static++;
System.out.println("Contador STATIC agora é = " + contador_static);
}
public void incrementaContador() {
contador_normal++;
System.out.println("Contador NORMAL agora é = "+ contador_normal);
}
}
public class Static{
public static void main(String args[])
{
System.out.println("\n1ª Instância -----");
StaticTemporaria s1 = new StaticTemporaria();
s1.incrementaStatic();
s1.incrementaContador();
System.out.println("\n2ª Instância -----");
StaticTemporaria s2 = new StaticTemporaria();
s2.incrementaStatic();
s2.incrementaContador();
System.out.println("\n3ª Instância -----");
StaticTemporaria s3 = new StaticTemporaria();
s3.incrementaStatic();
s3.incrementaContador();
System.out.println("\n4ª Instância -----");
StaticTemporaria s4 = new StaticTemporaria();
s4.incrementaStatic();
s4.incrementaContador();
}
}
A saída gerada por este programa será:
1ª Instância -----
Contador STATIC agora é = 1
Contador NORMAL agora é = 1
2ª Instância -----
Contador STATIC agora é = 2
Contador NORMAL agora é = 1
3ª Instância -----
Contador STATIC agora é = 3
Contador NORMAL agora é = 1
4ª Instância -----
Contador STATIC agora é = 4
Contador NORMAL agora é = 1
Note que o atributo "contador_static", que é static, não teve seu valor zerado
a cada novo objeto criado da classe StaticTemporaria, mas sim incrementado,
enquando "contador_normal", que é um atributo comum, ficou sempre em 1, pois
zeramos o valor no construtor da classe.