Variavel membro static + final

Seguinte…reparem os 3 trechos de codigo a seguir :

1º exemplo :

[code]public class VarFinalandStatic1 {
private final int i ;

public VarFinalandStatic1(){
	this.i = 10;
	
}

}[/code]

2º exemplo :

[code]class VarFinalandStatic2{
private static int i ;

public VarFinalandStatic2(){
i = 10;
}

}[/code]

3º xemplo:

[code]class VarFinalandStatic3{

static final int i=10;

public VarFinalandStatic3(){
			
}

}[/code]

Gostaria de saber, porque este proximo exemplo…não compilará …e se isso ocorre pelo fato de eu estar utilizando os modificadores “static” e “final” junto…

reparando no 3º exemplo…em que é feita uma declaração e atribuição juntas…acaba funcionando OK…

mas porque o simples fato de deixar para inicializar a variavel membro final dentro do construtor( que até aonde eu sabia…era possivel…) faz com que isso nao compile?

se nao for por causa disso… porque então ?

[code]class VarFinalandStatic4{

static final int i;

public VarFinalandStatic4(){
	
	i = 10;
			
}

}[/code]

Obrigado pessoal!!!

Voce somente pode atribuir algum valor a uma variavel “final” uma unica vez - que eh quando voce inicia o valor dela.

As partes “static” do teu codigo - blocos, variaveis - sao iniciadas antes que voce tenha uma instancia da classe, ou seja, antes de voce chamra o construtor.

Juntando as pecas: “static final” faz com que o valor da variavel seja setado para o default - 0 no caso - antes mesmo que voce consiga ter uma instancia da classe, o que ocasiona o erro de compilacao caso voce tente atribuir o valor a essa variavel em algum outro ponto do codigo.

Agora, se voce fizesse

static final int i;

static {
    i = 20;
}

nao daria erro de compilacao.

Rafael