Estou estudando sobre modificadores e encontrei a seguinte afirmação:
Fiz alguns testes, mas dá erro de compilação.
Obrigado
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 ^^