Variáveis finais

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

ate o final do construtor da classe.

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

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”.

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
    }
}

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:

pq eh uma constate…

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?"); }
}

so pra concluir, isso compila e roda:

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

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

ps. aspas pq o tambem é static

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.

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: