Atribuição de Variaveis Estáticas Finais

E ai galera! Segundo Post hoje, acho que hoje eu vo enche o saco, hehehe!!!

Olhem só, eu tenho o seguinte código abaixo:

[code]
public class SegundaClasse {

static final int b ;

public static void main (String[] args) {
    
   b = 2;[/code]

Não Compila, E diz que eu não posso inserir um valor em uma variavel constante. Mas aí é que está: Eu tenho que inicializar a mesma, correto? Se eu não inicializar logo na declaração, eu não posso inicializa-la depois?

Outra Dúvida:

[code]
public static void main (String[] args) {

   static final int variavel = 1;[/code]

Esse Código também não compila! Ai eu pergunto: Porque!? Eu nao posso declarar variaveis estaticas dentro de um contexto estático? Todas as variaveis contidas dentro de um contexto estatico, “implicitamente” são estáticas, correto? Então, eu só estou deixando explicito o que já é implicito. Ou tem alguma coisa a ver com o final?

Valew pessoal!

Bom,
acredito que: No seu primeiro exemplo, sua variavel era final ou seja, o valor de sua variavel não poderá ser alterado.

Ou você cria assim:

[code]public class SegundaClasse {

static final int b = 2;   
   
public static void main (String[] args) {   [/code]           

Ou você não cria.

Já no segundo exemplo é mais ou menos como você disse, basta retirar o static de sua variavel.

Variável final:
Uma variável final ela tem que ser inicializada até o contrutor do objeto, depois disso não pode ser alterado o seu valor fica só para leitura.

Variável static:
Uma variável static ela é como se fosse uma variável global já que em java não existe variável global, como ela está em um escopo de método (no seu caso no método main) ela não pode ser global, pois quando sair do método as variáveis dos métodos não existem mais, são destruídas, ai ela não pode ser global. Tem mais coisas escondidas em uma variável [/b]static[b].

[quote=Alberes]Variável final:
Uma variável final ela tem que ser inicializada até o contrutor do objeto, depois disso não pode ser alterado o seu valor fica só para leitura.

Variável static:
Uma variável static ela é como se fosse uma variável global já que em java não existe variável global, como ela está em um escopo de método (no seu caso no método main) ela não pode ser global, pois quando sair do método as variáveis dos métodos não existem mais, são destruídas, ai ela não pode ser global. Tem mais coisas escondidas em uma variável static.[/quote]

Perfeita sua colocação. Mas só uma pergunta… como assim não existe variavel global em java? :shock:

Jaba, de uma olhada nesse tutorial:

http://www.guj.com.br/java.tutorial.artigo.121.1.guj

Ensina a como utilizar e entender as variaveis estaticas

Veja bem, variável global é uam coisa, static é outra. São conceitos diferentes. No desenvolvimento java esse negócio de variavel global não é uma boa pratica.

Pode sim. Mas só em um bloco de inicialização static:

public class SegundaClasse {

    static final int b ;
    static {
         b = 2;
    }

    // ...
}

[quote]
Outra Dúvida:

[code]
public static void main (String[] args) {

   static final int variavel = 1;[/code]

Esse Código também não compila! Ai eu pergunto: Porque!? Eu nao posso declarar variaveis estaticas dentro de um contexto estático? Todas as variaveis contidas dentro de um contexto estatico, “implicitamente” são estáticas, correto? Então, eu só estou deixando explicito o que já é implicito. Ou tem alguma coisa a ver com o final?

Valew pessoal![/quote]

Static só faz sentido para membros (variáveis e métodos) de uma classe.
Não pode ser usado dentro de blocos de código (corpos de métodos, construtores ou
blocos de inicialização).
Em C e C++, podia, mais essa é outra história.

Espero ter ajudado,

Jorge

Variaveis finais podem sim ser atribuidas um valor no construtor da Classe… entretanto como ela é static nada garante que voce vai criar um Objeto dessa classe antes de usar a variavel.

Variáveis finais -> só são atribuídas no construtor

Variáveis finais estáticas -> só são construídas no construtor estático

Isso não compila:

public class TesteStatic {
	static final int b;
	public TesteStatic() {
		b=2;
	}
}

Isso compila:

public class TesteStatic {
	static final int b;
	static {
		b=2;
	}
	public TesteStatic() {
	}
}

E não inicializar a variável também não compila:

public class TesteStatic {
	static final int b;
	public TesteStatic() {
	}
}

Portanto, é garantido que a variável será inicializada antes do uso sim.

Variável final: após inicializada, não pode ter seu valor alterado. Exemplo:

private final int a = 10;

Ou:

public class Teste {

    private final int a;

    public Teste() {
        a = new Random().nextInt(); // após essa atribuição não é mais
        // possível alterar o valor da variável
    }

}

Método final: não pode ser sobrescrito por subclasses. Exemplo:

public class Teste {

    public final void imprimeFrase() {
	System.out.println("Olá mundo!");
    }

}

O método imprimeFrase não pode ser sobrescrito. Uma tentativa de fazer isso resultaria em um erro de compilação:
Cannot override the final method from Teste

Variável estática: variável que tem o mesmo valor para todas as INSTÂNCIAS daquela classe. Por exemplo:

public class Teste {

    private static int id = 0;

    public static int getId() {
	return id;
    }

    public void aumentaID() {
	id++;
    }

}

Uma vez alterado o valor de ID em uma das instâncias, o valor da variável da classe é alterado (essa é uma variável de classe e não de instância).

Método estático: similar as variáveis estáticas. Exemplo:

package java.lang;

public final class Integer extends Number {

    private int i;

    public Integer(int i) {
        this.i = i;
    }

    public static Integer valueOf(int i) {
        return new Integer(i);
    }

    ......

}

Por fim, variáveis estáticas e finais: são aquelas variáveis de classes que não podem ter seus valores alterados, ou seja, são um espécie de constates globais. Em geral (nem sempre), são públicas e a convenção é que as nomeie apenas com letras maiúsculas e sublinhados(_). Exemplo:

package java.lang;

public final class Integer extends Number {
    public static final int MIN_VALUE = -2147483648;
    public static final int MAX_VALUE = 2147483647;
    .......
}

Variáveis finais -> só são atribuídas no construtor

Variáveis finais estáticas -> só são construídas no construtor estático

Portanto, é garantido que a variável será inicializada antes do uso sim.
[/quote]

Voce me enterpretou errado…

variaveis finais podem receber seu valor na declaração do atributo.
Ou então no construtor da Classe.

variaveis finais estaticas podem receber seu valor na declaração do atributo.
Ou em um bloco static no escopo da Classe.

E no construtor da Classe(Falando sobre static final) nada garantiria que voce iria construir um objeto antes de usar essa variavel.