Trabalhando com Static

Srs, me deparei com um desafio (ao menos para mim que sou iniciante)

Uma apostila vem perguntando, pq o código abaixo não compila?

OBS: Quando declaro a variavel x, como static int x. Ai compila… mas não sei explicar porque, poderiam me ajudar?

package Desafio;

public class Teste
{
int x = 37;
public static void main(String [] args)
{
System.out.println(x);
}
}

Um método static pode ser executado sem que crie uma instancia da classe, esse seu método ta chamando a variavel x, porém qdo ele for chamado, a variavel não irá existir, a declaração da variavel não sera executada(pois ta fora do método e não é static)…
pra isso vc deixa a variavel como static tb, para existir mesmo q não se instancie a classe… ou então vc declara a variavel dentro do método, para q essa declaração seja executada…

deu pra entender? o.O’

porque, em uma classe, o método estático só enxerga os atributos da classe que são estáticos também… caso contrário, ele não enxerga… por exemplo:

[code]
public teste{
public int x = 0;

   public static void testeStatic(){
            System.out.print(x);
   }

}//errado[/code]

[code]
public teste{
public static int x = 0;

   public static void testeStatic(){
            System.out.print(x);
   }

}//certo[/code]

É porque o x pertence a uma instância do objeto Teste, portanto ele não pode ser acessado de um contexto static.
Você tem que instanciar a classe Teste ou acrescentar static na definição de x.
Quando colocar seu código no fórum, selecione-o e clique no botão Code acima da área de texto.

Boa sorte!