...Entendendo static...
É um modificador que pode ser utilizado para métodos e váriaveis. Quando algum recurso é marcado com esse modificador pertence a uma classe e nao suas instâncias.Entao, podemos acessar métodos ou variáveis estáticas, sem mesmo criar uma cópia da classe. Usando o modificador static, garante que haverá sempre uma
única referência, para métodos ou variáveis.Declarando algo como
Static, todas as instancias da classe irá compartilhar a mesma cópia da variável ou método.
E outra coisa, é que podemos acessar diretamente, sem a necessidade de instânciar uma classe, como nao acontece em não static.
Dentro de métodos estáticos, podemos acessar somente outros métodos e variáveis estáticos.
Um exemplo para minha compreensão:
class Exemplo
{
public static int contador = 0;
public int outroContador = 0;
public Exemplo() {}
public static void incrementaContador()
{
contador++;
System.out.println("contador agora é "+ contador);
}
public void incrementaOutroContador()
{
outroContador++;
System.out.println("outroContador agora é "+ outroContador);
}
}
public class StaticTeste
{
public static void main(String args[])
{
Exemplo ex1 = new Exemplo();
ex1.incrementaContador();
ex1.incrementaOutroContador();
Exemplo ex2 = new Exemplo();
ex2.incrementaContador();
ex2.incrementaOutroContador();
Exemplo ex3 = newExemplo();
ex3.incrementaContador();
ex3.incrementaOutroContador();
Exemplo ex4 = newExemplo();
ex4.incrementaContador();
ex4.incrementaOutroContador();
}
}
Saída:
contador agora é 1
outroContador agora é 1
contador agora é 2
outroContador agora é 1
contador agora é 3
outroContador agora é 1
contador agora é 4
outroContador agora é 1
**reparem uma coisa, que a variável "contador" teve seu valor incrementado a cada novo objeto criado, enquanto a variável "outroContador", nao mudou o seu valor, ficou sempre em 1, pois seu valor foi zerado em seu construtor da classe.**
Um outro exemplo mostra que usando o modificador static, podemos acessar diretamente um método ou uma váriável , sem a necessidade instânciar a classe, ou seja, (acesso direto).
class Exemplo2
{
public static void escreve(String msg)
{
System.out.println(msg);
}
public static int multiplica(int n1, int n2)
{
return (n1 * n2);
}
public Exemplo2()
{
System.out.println("Construtor do Exemplo2");
}
}
public class StaticTeste2
{
public static void main(String args[])
{
//acessando diretamente
Exemplo2.escreve("Multiplicando 3 vezes 3:");
int resultado = Exemplo2.multiplica(3, 3);
Exemplo2.escreve("Resultado: "+ resultado);
}
}
Agora se não fosse static:
public class StaticTeste2
{
public static void main(String args[])
{
// necessário instanciar a classe para acessar
Exemplo2 ex2 = new Exemplo2();
ex2.escreve("Multiplicando 3 vezes 3:");
int resultado = ex2.multiplica(3, 3);
ex2.escreve("Resultado: "+ resultado);
}
}
...