no livro do Deitel é dito que é um erro um método static chamar um método ou variável de instância.
se eu tentar compilar o programa abaixo, surgirá a seguinte mensagem de erro: non-static method fazNada() cannot be referenced from a static context
public class Teste {
public static void main(String[] args) {
fazNada();
}
void fazNada() {
int var = 0;
}
}
porém se eu fizer assim, funciona.
public class Teste {
public static void main(String[] args) {
Teste teste = new Teste();
teste.fazNada();
}
void fazNada() {
int var = 0;
}
}
Mas no segundo caso, o método estático main não está chamando um método de instância?
Em programas curtos, sendo o método main estático, eu não posso chamar diretamente outros métodos da classe dentro dele?
A solução é mesmo fazer como no segundo caso apresentado acima, ou fazer todos os métodos do tipo static??
Variáveis e métodos estáticos pertencem a classe e não a instância do objeto. Quando você chama um método dentro de outro, é o mesmo que chamar this.myMethod(). Como no código abaixo.
...
public void methodA() {
this.myMethod();
}
public void myMethod() {
...
}
...
Como os métodos estáticos não pertencem a uma instância de objeto, você não consegue acessar métodos não estáticos dentro deste, a não ser que você crie um novo objeto, o que você faz no segundo bloco de código, e chame nesta nova referência o método não estático de sua classe.
Realmente parece que seriam programas mais curtos, mas os problemas com variáveis e métodos estáticos só acontece quando envolvem mais de uma instância, e onde cada instância estaria modificando valores que são únicos para ela e todas as outras.
Realmente o que você fez é o certo a se fazer quando vamos trabalhar com métodos não estáticos dentro de blocos estáticos.
Métodos estáticos só podem acessar membros do contexto estático (“Que pertencem à classe”)
No segundo caso você está invocando um método de “instância de classe” através de uma referência da instância. Perfeitamente válido!
Complemento: Quando você invoca quaisquer métodos estáticos (de classe) através de uma instância, tal como teste.fazNadaEstatico(); O compilador reconhece da seguinte forma: teste.fazNadaEstatico;() é um Teste.fazNadaEstatico();