Variáveis finais

11 respostas
P

Quando eu declaro uma variável final, ela deve ser inicializada nesta momento, ou pode ser inicializada no decorrer do programa?

11 Respostas

maxguzenski

ate o final do construtor da classe.

P

Desculpe, mas vc tem certeza disso, porque me disseram a pouco que sim, que as variáveis finais tinham que ser inicializadas no momento de sua declaração

D

Tb não tenho muito certeza disso não… façamos um teste:

public class Ummm {

     public static void main(String[] args) {
           Uoh o = new Uoh();
           System.out.println(o);
     }
}

class Uoh {
    private final int i;

    public Uoh() {
         i = 2;
    }

    public String toString() {
          return ( "[Uoh] i=" + i );
    }
}

É… funfa! :smiley:
[por edição] O que vc não pode é querer modificar i… por exemplo:

// no método toString()... public String toString() { i++; return ( ...

dai vc vai ter uma mensagem “cannot assign a value to final variable i”.

maxguzenski

sim, tenho certeza.

public class teste {
    final int i;
    
    public teste() {
         // um monte de codigo; 
         i = 42; // OK, so nao pode Inicializar dinovo, mesmo arqui dentro
    }
}
P

e então alguem saberia dizer porque isso aqui nao compila ? :wink:

public class teste { 
    static final int i; 
    
    public teste() { 
         // um monte de codigo; 
         i = 42;     } 
}

[]´s :wink:

J

pq eh uma constate…

maxguzenski

por q as static é inicializada quando a classe vai pra memoria. isto é, o atributo é uma instancia da classe e nao do objeto…

e atributos static’s tem seu valor definido antes do construtor da classe ser chamado… quando voce fez i = 42, i ja deve ter um valor, pois a classe ja esta em memoria.

public class teste  {
     static {
        System.out.println("isso roda primeiro????");
     }

     public teste() { System.out.println("ou sera isso?"); }
}
maxguzenski

so pra concluir, isso compila e roda:

class teste {
    static final int i;
    
    static {
          // um monte de codigo 
          i = 42; 
    }
}
J

ô max… e nao tem nada a ver com o fato dela ser “também” uma constante nao veio ?

ps. aspas pq o tambem é static

maxguzenski

sim, por ser static+final …

mas so queria mostrar que nao precisa "ser na declaracao"
pode ser no construtor quando for atributo do objeto ou num bloco static quando for atributo da classe.

J

blz… valeu ai… eh pq eu estudei isso antes de ontem e eu ja ter esquecido isso seria melhor ir ali na praia de Boa Viagem vender amendoim :stuck_out_tongue:

Criado 30 de março de 2004
Ultima resposta 2 de abr. de 2004
Respostas 11
Participantes 5