Quando e porquê usar static?
Hoje me deparei com um problema, no qual era algo bem simples mas fiquei remando horas e horas até que descobri que era um problema estático.
Então resolvi postar aqui o assunto com um exemplo bem simples.
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. 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.
Então é isso ae, espero ter esclarecido este assunto.
T+
Um comentário:
ok, Leandro
seu blogerr ajudou bastante.
estou entrando na area de desenvolvimento e precisava
de uma definiçao sobre o metodo
static.
Anildo
Postar um comentário