Static...?

A grande dúvida a qual eu relatei sobre variavel static é sobre um jogo que eu fiz… finalmente acabei mais ainda não entendi o que é variavel static
vo deixar o código ai embaixo para que vcs possam verificar… e me explicar como elas funcionaram dentro do meu programa…!

classe main


public class JogodeAzarmain
{
	public static void main(String args[])
	{
		JogodeAzar classe = new JogodeAzar();
		
		classe.play();
	}
}

classe de metodos

/* Jogo de azar:Você lança 2 dados,cada dado tem seis faces
 *quem contêm um,dois três,quatro,cinco e seis pontos respectivamente
 *Depois que os dados param de rolar, a soma dos pontos nas faces viradas
 *para cima é calculada,se a soma for 7 ou 11 no primeiro lance, Você ganha
 *se a soma for 2,3 ou 12 no primeiro lance Você perde,se a soma for 4,5,6,8,9 ou 10
 * no primeiro lance,essa soma torna-se sua 'pontuação'
 *,para ganhar,Você deve continuar a rolar os dados até fazer sua pontuação
 *('isto é,obter um valor igual á sua pontuação).Você perde se obtiver um 7 antes de fazer
 *a pontuação.*/
 
 
 import javax.swing.*;
 import java.util.Random;
 
 public class JogodeAzar
 {
 	Random aleatorio = new Random();
 	
 	// enumeração com constantes quer representam o status do jogo
 	private enum Status{CONTINUE,WON,LOST};
 	
 	//constantes que representam lançamentos comuns
 	
 	private static final int two =2;
 	private static final int tree =3;
 	private static final int sevem =7;
 	private static final int elevem= 11;
 	private static final int twelve =12;
 	
 	//começa o jogo
 	
 	public void play()
 	{
 		int cont=0;
 		Status jogo;//pode conter CONTINUE,WON,LOST,status do jogo
 		int soma = roladados();//primeira rolagem dos dados
 		
 		switch(soma)
 		{
 			case sevem:
 			case elevem:
 			jogo =Status.WON;
 			break;
 			
 			case two:
 			case tree:
 			case twelve:
 			jogo=Status.LOST;
 			break;
 			
 			default:
 			jogo=Status.CONTINUE;
 			cont=soma;
 			JOptionPane.showMessageDialog(null,"Sua pontuação é "+cont);
 			break;	
 			
 		}
 		
 		while(jogo== Status.CONTINUE)//nem WON nem LOST
 		{
 			soma=roladados();//lança dados novamente
 			
 			//determina status do jogo
 			if(soma==cont)
 			{
 				JOptionPane.showMessageDialog(null,"Você ganhou");
 			}
 			
 			else if(soma==sevem)
 			{
 				JOptionPane.showMessageDialog(null,"Você perdeu");
 			}
 		}
 		
 		
 	}//fim do método play
 	
 	public int roladados()
 	{
 		int rola=  1 +aleatorio.nextInt(6);//primeiro lançamento
 		int rola1= 1 +aleatorio.nextInt(6);//segundo lançamento
 		
 		int soma = rola+rola1;
 		
 		JOptionPane.showMessageDialog(null,"O valor desse lançamento é \n1° lançamento "+rola+"\n2º lançamento "+rola1+"\n Valor total do lançamento "+ soma);
 		
 		return soma;
 	}
 	
 }

Bom, como vc viu, não muda nada na execução do seu jogo…
Mas calma lá, não muda nada visualmente.
A diferença entre um campo static e um não static é a seguinte:
quando você declara um campo de classe como static esta variável será compartilhada por todos os objetos criados (com o tipo da sua classe).
Em outras palavras, um campo de classe NÃO static vai fazer com que todos os objetos criados com o new tenham uma cópia própria dessa variável. Já um campo static faz com que todos os objetos da classe utilizem a mesma cópia da variável. Isso permite que esse membro da classe seja utilizado em uma outra classe através de um get (desde que essa outra classe tenha objetos da sua classe com os campos static - mas mesmo que não tenha você também pode referenciar esse campo static através de um método get que seja tb static)…
No caso do seu jogo você tem váriavel final que indica que essa variável não vai mudar, certo? Por isso não há necessidade de que cada objeto dessa classe tenha uma cópia separada do campo. Sempre que declarar um campo final, declare-o também como static, permitindo que todos os objetos dessa classe compartilhem o campo final.

Aquele abraço!