Preciso inicializar uma variável na declaração quando for final?

Estou estudando sobre modificadores e encontrei a seguinte afirmação:

Fiz alguns testes, mas dá erro de compilação.

Obrigado

Atributos final, podem ser inicializados 2 maneiras:

1-) Na declaração

2-) Dentro do construtor.

Como esta fazendo?

Variáveis final podem ser atribuídas somente uma vez.

Ou você faz junto com a declaração (inline):

final String URL_GUJ = "http://www.guj.com.br/";Ou após a declaração:

final String URL_GUJ; URL_GUJ = "http://www.guj.com.br/";
Se o compilador detectar que é possível mais de uma atribuição, então ele vai falhar.

isso … vc pode apenas inicializar ( se quiser ), na declaração. Caso não o faça, não terá problemas, mas quando vc atribuir algum valor a ela, o mesmo não poderá ser modificado…

[code] .
.
final int a = 0;

void metodo() {
a = 1; // erro
}
.
. [/code]

[code] .
.
final int a;

void metodo() {
a = 1; // ok, inicializou
a = 2; // erro, não é permitido alterar
}
.
.[/code]

Qual o erro que esta tendo?

Esta correto.

extamente como o btafarelo falou…

ou vc faz assim

[code]public class Inscricao {

public final String inscricao;

public Inscricao(String inscricao) {
    this.inscricao = inscricao;
}

}[/code]

ou assim

[code]public class Inscricao {

public final String inscricao = "111234";

public Inscricao() {
}

}[/code]

não inicializar da erro… por exemplo o código abaixo não compila

[code]public class Inscricao {

public final String inscricao;

public Inscricao() {
}

}[/code]

[quote=sowyer]isso … vc pode apenas inicializar ( se quiser ), na declaração. Caso não o faça, não terá problemas, mas quando vc atribuir algum valor a ela, o mesmo não poderá ser modificado…

[code] .
.
final int a;

void metodo() {
a = 1; // ok, inicializou
a = 2; // erro, não é permitido alterar
}
.
.[/code][/quote]

vc não pode declarar uma variavel de classe final e não inicializar … ou vc faz dentro do construtor, ou faz na declaração…

vc pode fazer isso dentro de métodos

por exemplo

public void meuMetodo() { final int constante; if (isOK()) constante = 7; else constante = 12; System.out.println(constante*33); constante = constante + 12; // <---- isso não é permitido o resto do código esta ok }

certo eu entendi, acontece que eu estava declarando final static. Aí sim, ele só aceita na declaração. Por que ?

Se o atributo for static quer dizer que o atributo será o mesmo para todas as instâncias certo?

Então ele tem que subir com a primeira instância para memória, e por isso só pode ser ali, porque senão, toda vez que você executar o método o valor estaria sendo definido.

c vc precisar de escopo para criar o valor vc pode fazer assim

public static final String CONSTANTE_DEFINIDA_EM_ARQUIVO; public static final String LOAD; static { try { CONSTANTE_DEFINIDA_EM_ARQUIVO = recuperaOValorDaConstanteDoArquivo(); LOAD = "sucesso"; } catch (Exception ex) { CONSTANTE_DEFINIDA_EM_ARQUIVO = "uma msg padrao"; LOAD = "fracasso"; } finally { umMetedoQueFechaOArquivo(); } //Ps.: todos os metodos aqui tem q ser estaticos, se forem da mesma classe ^^ }

Outra observação é… static é como o btafarelo falou…

quando um atributo é statico quer dizer que ele não é um atributo dentro da instancia, e sim ele é o mesmo para todas as instancias da mesma classe

por exemplo

public class Teste { private static msg = ""; Teste(String msg) { Teste.msg = msg; } public String getMsg() { return msg; } }

c vc fizer assim

[code]Teste a = new Teste(“se vc pensa”);
Teste b = new Teste(“que cada classe”);
Teste c = new Teste(“vai ter sua propria msg”);
Teste d = new Teste(“então vc esta”);
Teste e = new Teste(“redondamente enganado”);

System.out.println(a.getMsg() );
System.out.println(b.getMsg() );
System.out.println(c.getMsg() );
System.out.println(d.getMsg() );
System.out.println(e.getMsg() );

//toda as linhas imprimirão “redondamente enganado”, pois msg é um campo statico e serve a todas as classes.[/code]

Mas assim, o construtor tb é chamado quando a classe é carregada, então por isso imagine que poderia fazer isso:

public class Exemplo
{
   static final int x;

     public Exemplo()
    {       
        x = 5;
     } 
}

[quote=efcjunior]Mas assim, o construtor tb é chamado quando a classe é carregada, então por isso imagine que poderia fazer isso:

[code]
public class Exemplo
{
static final int x;

 public Exemplo()
{       
    x = 5;
 } 

}
[/code][/quote]
E se nenhuma instância da classe for criada? Se eu simplesmente fizer isso:

System.out.println(Exemplo.x);

???

quando eu faço por exemplo: Exemplo.x, construtor não é invocado ?

Não. Tanto que interfaces podem ter constantes (e interfaces nunca são instancidas).
Por exemplo:

SwingConstants.CENTER; // não é possível instanciar uma interface

valeu galera, obrigado, esclareceram muita coisa !

[quote=efcjunior]valeu galera, obrigado, esclareceram muita coisa !

[/quote]

^^ so declare final quando realmente for uma constante… se o seu medo é de so inicializar a variável quando ela for chamada, isso já acontece, nada vai pra memoria ate que alguem chame por Exemplo.x, so a partir dai, a JVM aloca o valor do “x” da classe Exemplo na memoria ^^