Em geral, static
significa "associado ao próprio tipo , em vez de uma instância do tipo".
Isso significa que você pode fazer referência a uma variável estática sem nunca ter criado uma instância do tipo, e qualquer código referente à variável está se referindo exatamente aos mesmos dados. Compare isso com uma variável de instância: nesse caso, há uma versão independente da variável por instância da classe. Então, por exemplo:
Test x = new Test();
Test y = new Test();
x.instanceVariable = 10;
y.instanceVariable = 20;
System.out.println(x.instanceVariable);
imprime 10: y.instanceVariable
e x.instanceVariable
são separados, porque x
e y
se referem a diferentes objetos.
Você pode consultar membros estáticos por meio de referências, embora seja uma má idéia fazer isso. Se nós fizemos:
Test x = new Test();
Test y = new Test();
x.staticVariable = 10;
y.staticVariable = 20;
System.out.println(x.staticVariable);
então isso imprimiria 20 - há apenas uma variável, não uma por instância. Teria sido mais claro escrever isso como:
Test x = new Test();
Test y = new Test();
Test.staticVariable = 10;
Test.staticVariable = 20;
System.out.println(Test.staticVariable);
Isso torna o comportamento muito mais óbvio. Os IDEs modernos geralmente sugerem mudar a segunda lista para a terceira.
Não há razão para ter uma declaração embutida inicializando o valor da seguinte maneira, pois cada instância terá seu próprio, NUMBER
mas sempre com o mesmo valor (é imutável e inicializado com um literal). É o mesmo que ter apenas uma final static
variável para todas as instâncias.
private final int NUMBER = 10;
Portanto, se não puder mudar, não há sentido em ter uma cópia por instância.
Mas, faz sentido se for inicializado em um construtor como este:
// No initialization when is declared
private final int number;
public MyClass(int n) {
// The variable can be assigned in the constructor, but then
// not modified later.
number = n;
}
Agora, para cada instância de MyClass
, podemos ter um valor diferente, mas imutável de number
.