Exceto pelo método main () , estivemos analisando métodos de instância. Métodos estáticos não requerem uma instância da classe. Eles são compartilhados entre todos os usuários da classe. Você pode pensar na estática como um membro do objeto de classe única que existe independentemente de quaisquer instâncias dessa classe.
Cada classe possui sua própria cópia do código?
Cada classe possui uma cópia das variáveis da instância. Existe apenas uma cópia do código para o métodos de instância. Cada instância da classe pode chamá-lo quantas vezes quiser. No entanto, cada chamada de um método de instância (ou qualquer método) obtém espaço na pilha para parâmetros de método e variáveis locais.
O mesmo acontece com métodos estáticos. Há uma cópia do código. Parâmetros e variáveis locais vão para a pilha.
Lembre-se de que apenas os dados obtêm sua “própria cópia”. Não há necessidade de duplicar cópias do próprio código.
Vimos um método estático desde o Capítulo 1. O método main () é um método estático. Isso significa que você pode chamá-lo pelo nome da classe.
public class Koala {
public static int count = 0; // static variable
public static void main(String[] args) { // static method
System.out.println(count);
}
}
Dissemos que a JVM basicamente chama Koala.main() para iniciar o programa. Você pode fazer isso também. Podemos ter um KoalaTester que não faz nada além de chamar o método main() .
public class KoalaTester {
public static void main(String[] args) {
Koala.main(new String[0]); // call static method
}
}
Uma maneira bastante complicada de imprimir 0, não é? Quando executamos o KoalaTester , ele faz uma chamada para o método main () do Koala , que imprime o valor da contagem . O objetivo de todos esses exemplos é mostrar que main () pode ser chamado como qualquer outro método estático.
Além dos métodos main () , os métodos estáticos têm dois objetivos principais:
■ Para métodos utilitários ou auxiliares que não exigem nenhum estado de objeto. Como não há necessidade acessar variáveis de instância, ter métodos estáticos elimina a necessidade do chamador instanciar o objeto apenas para chamar o método
■ Para estado compartilhado por todas as instâncias de uma classe, como um contador. Todas as instâncias devem compartilhar o mesmo estado. Os métodos que apenas usam esse estado devem ser estáticos também.
Vejamos alguns exemplos que abrangem outros conceitos estáticos.