Quando usar o modificador static ?
Não pensem que a palavra-chave static define que uma variável não possa mudar de valor. O uso da palavra-chave static é confundido por muitos programadores, até por alguns mais experientes. Quando uma variável ou método é declarado static, estes são carregados na memória pela JVM. Vou explicar melhor:
No java, quando uma classe é usada(Seja por instância ou diretamente nos membros estáticos), suas váriaveis e seus métodos estáticos ganham um lugar na mémoria RAM do computador enquanto o programa é executado. Mas, este lugar(ou endereço) é usado pela classe, ou seja, todas as instâncias dessa classe, quando utilizam esta variável, estão na verdade utilizando a variável da classe, e não do objeto. Assim, todas as instâncias dessa classe terão o mesmo valor para aquela variável estática. Vejamos isso no código!
public class MinhaClasse {
// Defino uma variável estática para a classe MinhaClasse
public static int minhaVariavelStatic;
// Defino uma outra variável não-estática para a classe MinhaClasse
public int variavelNormal;
}
Nossa classe executável:
public class Main {
public static void main(String args[]){
//Podemos acessar minhaVariavelStatic diretamente pela classe,
//sem precisar instancia um novo objeto para seu uso.
MinhaClasse.minhaVariavelStatic = 3;
//Neste momento a JVM carrega todos os métodos e variáveis estáticos,
//da classe MinhaClasse na memória. Isto acontece agora, porque é a
//primeira utilização da classe pelo programa. (A JVM só utiliza memória,
//quando realmente é necessário.)
// Instânciamos dois objetos a partir da classe MinhaClasse.
MinhaClasse a = new MinhaClasse();
MinhaClasse b = new MinhaClasse();
// imprimimos o valor da varial a partir do objeto a
System.out.println(a.minhaVariavelStatic);
// mudamos o valor da variável para 5 a partir do objeto a
a.minhaVariavelStatic = 5;
// imprimimos o valor da varial a partir do objeto b
System.out.println(b.minhaVariavelStatic);
}
}
Quando executarmos, vemos a saída:
3
5
A saída foi 3 e depois 5! Como pode isto a partir de objetos diferentes?
Atribuimos o valor 3 para a variável minhaVariavelStatic diretamente na classe MinhaClasse, e quando imprimos pelo objeto a a invés da saída ser 0(zero), foi 3! E quando mudamos o valor da variável estática a partir do objeto a para 5, podemos perceber que essa mudança esta presente também no objeto b, porque quando imprimos a saída foi 5. Isto acontece porque variáveis estáticas possuem somente um único valor para todas as instâncias de sua classe! A variável estática pertence a Classe e não a instância(ou objeto). Ao contrário de membros não-estáticos que só podem ser acessados a partir de uma instância. Pois seus valores são individuais para cada objeto.
“Não percebi vantagem no uso desse modificador static!”
É alguns programadores não tem essa percepção. Mas é muito útil quando se necessita compartilhar uma informação entre todos os objetos de determinada classe, como alguma contagem ou totalização, até mesmo o ponteiro de uma conexão com um banco de dados.
Por isto que o método executável do java, o método main, é estático:
public static void main(String args[]){}
A JVM não poderia saber por onde comerça a execução do programa sem um método que possa ser acessádo diretamente, sem precisar de uma instância. Já pensou se a JVM tivesse que instanciar classe a classe até achar o método main, iria ficar muito lento, além do uso da mémoria. E se eu tiver dois métodos public e static? A JVM entende que o método main (escrito e minusculas) é o método de inicialização do programa, assim você pode ter outros métodos estáticos em suas classes, sem nenhum problema. Isto é padrão da JVM.
Existem também os blocos de código static que são exutados assim que a classe que o contenha é usada, antes mesmo do método main, se a classe o tiver.
public class Inicio {
static {
System.out.println("Executou o bloco estático!");
}
public static void main(String[] args) {
System.out.println("Executou o método main");
}
}
A execução dessa classe gerará a saída:
Executou o bloco estático!
Executou o método main
Quando a JVM procura logo os atributos, métodos e blocos de códigos estáticos antes mesmo da main ser executada. Porque já pensou se o método main for usar um membro estático que não estiver carregado na memória? Seria um erro.
Para que servem esses blocos de código static?
Os blocos de códigos estáticos são como um construtor de uma classe, servem quando se precisa inicializar, tratar ou pesquisar os valores de variaveis estáticas, as únicas que podem ser acessadas neste instante, antes mesmo do método main ou o método construtor possa ser executado. É praticamente um método construtor sem nome, sem argumentos(ou parâmetros) e nenhum tipo de retorno. Ele é sem nome porque não há necessidade de se referir a ele. Serve somente para trabalhar com os membros estáticos da classe antes de seu construtor ou do método main(caso seja a classe executável).
public class Inicio {
public static String data;
static {
data = "10/08/2008";
}
public static void main(String[] args) {
System.out.println("A data que escrevi este artigo era " + data);
}
}
Deste modo, usando os blocos de código estáticos, podemos tratar as variáveis estáticas antes de qualquer coisa.
Bom pessoal, espero que tenham gostado do artigo.
Comentem !!!
Valeu!