Estático vs. Instância
Há outra maneira dos criadores do exame tentarem enganá-lo em relação à estática e à instância membros. (Lembre-se de que "membro" significa campo ou método.) Um membro estático não pode chamar um membro da instância. Isso não deve ser uma surpresa, já que a estática não exige nenhuma instância da classe para estar por perto.
A seguir, é um erro comum que os programadores novatos cometem:
public class Static { private String name = "Static class"; public static void first() { } public static void second() { } public void third() { System.out.println(name); } public static void main(String args[]) { first(); second(); third(); // DOES NOT COMPILE } }O compilador fornecerá um erro ao fazer uma referência estática para um elemento método não estático . Se corrigirmos isso adicionando static ao third () , criaremos um novo problema. Você pode descobrir o que é?
Tudo isso faz é mover o problema. Agora, o third() está se referindo ao name não estático . Adicionando estático para name também resolveria o problema. Outra solução teria sido chamar third como método de instância - por exemplo, novo Static (). third (); .
Os criadores do exame gostam deste tópico. Um método estático ou método de instância pode chamar um método estático método porque métodos estáticos não requerem um objeto para usar. Somente um método de instância pode chamar outro método de instância na mesma classe sem usar uma variável de referência, porque métodos de instância exigem um objeto. Lógica semelhante se aplica à instância e variáveis estáticas capazes. Certifique-se de entender a Tabela 4.3 antes de continuar.
Vamos tentar mais um exemplo para ter mais prática em reconhecer esse cenário. Faz você entende por que as seguintes linhas não são compiladas?
1: public class Gorilla {2: public static int count;3: public static void addGorilla() { count++; }4: public void babyGorilla() { count++; }5: public void announceBabies() {6: addGorilla();7: babyGorilla();8: }9: public static void announceBabiesToEveryone() {10: addGorilla();11: babyGorilla(); // DOES NOT COMPILE12: }13: public int total;14: public static average = total / count; // DOES NOT COMPILE15: }As linhas 3 e 4 estão corretas porque os métodos estático e de instância podem se referir a uma variável estática. As linhas 5 a 8 são boas porque um método de instância pode chamar um método estático. Linha 11 não compila porque um método estático não pode chamar um método de instância. Da mesma forma, a linha 14 não compila porque uma variável estática está tentando usar uma variável de instância.
Um uso comum para variáveis estáticas é contar o número de instâncias:
public class Counter { private static int count; public Counter() { count++; } public static void main(String[] args) { Counter c1 = new Counter(); Counter c2 = new Counter(); Counter c3 = new Counter(); System.out.println(count); // 3 }}Cada vez que o construtor é chamado, ele incrementa a contagem em 1. Este exemplo depende do fato de que variáveis estáticas (e instância) são inicializadas automaticamente com o valor padrão para esse tipo, que é 0 para int . Consulte o Capítulo 1 para revisar os valores padrão.
Observe também que não escrevemos Counter.count . Nós poderíamos ter. Não é necessário porque já estamos nessa classe para que o compilador possa inferir isso.