Blocos estáticos

3 respostas
L

Por que java deixa eu referenciar a variavel estatica ‘t’ nessa caso?

public class Teste {
	static {
		t = 4;
	}
	static int t = 0;
}

A leitura da variavel não é permitida, dizendo que eu não posso fazer referencia a um campo antes de defini-la (bele):

public class Teste {
	static {
		t++;
	}
	static Integer t = 0;
}

Mesmo que o t = 4 não sirva para nada, não deveria dar o mesmo erro de compilação?!

valeu

3 Respostas

E

vamos aos misterios do java então…

pelo pelos testes realizados, pude concluir que o java processa
os atributos estaticos de acorco com a procedência dele no fonte…

bom primeiro caso que tu colocou ae:

static { t = 4; } static int t = 0;

o interpretador do codigo compila por ele acha o atributo declado após,
mas está apenas realizando uma operação de atribuição 2 vezes…, ou
seja a declaração do atributo estático pode ser feito após a sua valoração…

caso tu fizer:

static { t = 2; } static int t;
se mandar imprimir o resultado ele imprimirá = 2…
que será o mesmo efeito de seu código estar assim:

static int t; static { t = 2; }
ou ainda:

static int t = 10; static { t = 2; }

agora vamos ao caso que gerou o erro…:

static { t++; } static Integer t = 0;
nesse caso você está tentando realizar uma operação antes de inicializar o seu atributo estático, com isso gera erro pois você não possui valor algum no atributo para poder realizar alguma operação, porém se você alterar o seu fonte para:

static int t = 0; static { t++; }
irá funcionar…

com isso nesse caso, vendo o funcionamento após testes, tem como concluir que os atributos estáticos possue uma certa regra de organização de código…

lembrando o pensamento: você primeiro tem que atribuir algum valor ao atributo para depois realizar uma operação com o mesmo, que é o caso desse ultimo código, no código anterior, que gera erro, isso não ocorre, pois primeiro você está tentando incrementar o atributo, sendo que este possuem valor nenhum, por isso gera o erro…

:wink:

ficou com dúvidas ainda, nada como testar os códigos citados e ver o que acontece :grin:

L

A explicação de que o atributo deve estar “iniciado” até tem lógica… porém ainda acho que fica estranho e errado isso:

static {
		t = 1;
		System.out.println(t);
	}
	
	static int t = 2;

O t = 1 compila mas o Sysout(t) não, então se eu disser isso para alguem: “olha, isso ai não tá compilando porque t não foi iniciado”, o cara vai me dizer: “mas eu inicie, t = 1 ali encima, ele tem valor, afinal aquilo ali é um código sequencial, Sysout vai executar depois de t = 1”, ai eu digo: “tah não vale porque t ainda não foi “declarado””, ai o cara me diz: “então porque t = 1 funciona?”… eu sinceramente não vou ter uma explicação descente.

Por isso que não cheguei a uma conclusão da lógica desse treco, para mim devia dar erro até pro t = 1.

E qual seria a ordem de inicialização nesse caso?! olha esse código:

public class Teste {
	static class T {
		int valor;
		public T(int valor) {
			System.out.println(valor);
			this.valor = valor;
		}
	}

	static {
		t = new T(2);
	}

	static T t = new T(1);

	public static void main(String[] args) {
		System.out.println(Teste.t.valor);
	}
}

A variavel t está definida depois do bloco estatico, mas para mim, se java permite eu fazer t = new T(2), é porque ele ja sabe que a variavel t existe, ou seja, sabe que existe essa linha (que é onde declaro o t):

static T t = new T(1);

Mas na mesma linha que declaro t, eu crio um novo (new T(1)).

Quando executo, o primeiro a executar é o new T(2) para depois executar new T(1), logo parece que a linha de declaração de t é executada em “partes”, como se ele fizesse:

static T t;
t = new T(2);
t = new T(1);

8O

java tem umas coisinhas bem sem noção hein hehehe

_

Pelo que pude entender assim que a classe é carregada ela reconhece os seus atributos (variáves de instância) executa os os blocos de inicialização estáticos antes de qualquer coisa.

A execução de métodos e instanciação de variáveis so é executada após os blocos estáticos.Blocos estáticos são executados na ordem em que são declarados.

Criado 8 de junho de 2007
Ultima resposta 12 de jun. de 2007
Respostas 3
Participantes 3