Duvida STATIC [Alguém se arrisca?]

12 respostas
nbluis

Ai pessoal;

Seguinte, se alguém conseguir explicar por favor.

Olhem o seguinte código.

public class Car {
	static String name = "NULL";
	static {
		name = "MyCar";
	}
	public static void main(String[] args) {
		System.out.println(Car.name);	
	}
}

No retorno sai “MyCar”;

Porém quando troco a ordem do atributo e do bloco estático a saída é outra.
Exemplo

public class Car {
	static {
		name = "MyCar";
	}
	static String name = "NULL";
	public static void main(String[] args) {
		System.out.println(Car.name);	
	}
}

No retorno sai “NULL”;

Tem mais uma, se eu não inicializar o atributo name dai sempre sai MyCar
Assim

public class Car {
	static {
		name = "MyCar";
	}
	static String name;
	public static void main(String[] args) {
		System.out.println(Car.name);	
	}
}

Mesmo trocando a ordem, sempre sai “Mycar”.

Alguem tem idéia?

12 Respostas

nbluis

Ninguém?

D
Bem, não tenho ainda experiência, mas pelo que entendi é que atributos estáticos são compartilhados por toda as instâncias da classe, sendo assim ele irá mostrar a última referência feita a ele.

Ex:

public class Tv{

public static String marca = null;

}
public class TestTv{

public static void main(String[] args){

Tv t1 = new Tv();

Tv t2 = new tv();

System.out.println(t1.marca);//mostra null

System.out.println(t2.marca);//mostra null

t1.marca = LG;

System.out.println(t1.marca);//mostra LG

t2.marca = CCE;

System.out.println(t2.marca);//mostra CCE

System.out.println(t1.marca);//mostra CCe

}

}

Caros Colegas quero que avaliem, pois sobre atributos estáticos entendi assim.

nbluis

Como funcionam atributos e blocos estáticos eu sei, a dúvida é outra.

Por que diabos muda o resultado caso eu troque as chamadas de lugar?

Mais alguém?

Deh

Porque os blocos de inicialização são executados na ordem em que se encontram no código fonte.

Não seria isso?

L

Deve ser porque as chamadas são executadas sequencialmente, roda o Debug e ve a ordem de execução.

nbluis

Não tenho como pegar a hora da criação de um atributo da classe no debug.
O máximo que chego é a atribuição do atributo feita dentro do bloco estático.

Outra, se fosse isso mesmo, não faria diferença alguma se eu inicializasse a variável ou não, mas como eu disse acima, se a variável tiver um valor acontece uma coisa senão acontece outra.

Coisa bizarra.

ViniGodoy

O fato é que essas inicializações são tão complexas que nem a Sun se entendeu direito ainda.

Mas, aparentemente está respeitando a ordem em que aparece. E, sempre priorizando uma atribuição de valor.

T

A inicialização ocorre de cima para baixo, na ordem em que aparecem

public class Car { static { name = "MyCar"; } static String name; public static void main(String[] args) { System.out.println(Car.name); } }

a razao por este trecho funcionar eh que static String name; não é uma instrucao e sim uma declaracao… vale lembrar que as inicializações ( name = null, por exemplo) se tornam no bytecode algo como

static String nome; //isso eh uma declaracao de variavel estatica
static {
  nome = null; //isso aqui eh uma atribuicao
}

para variaveis estaticas, e sao inseridas nos construtores para variaveis de instancia

nbluis

Muito bom takeshi10 e ViniGodoy.

Vale para lembrarmos o cuidado que temos que ter ao utilizar estas atribuições.

Valeu mesmo.

jPscoralicK

agora me surgiu uma dúvida:

static { 

// código

}

as chaves são necessárias sempre que eu inicializar uma variável static?

T

nao… as chaves sao usadas para delimitar um bloco de estatico… em um bloco estatico voce pode colocar codigo que sera executado durante o carregamento da classe, como, por exemplo, a inicializacao de alguma variavel estatica

jPscoralicK

vlw

[ ]

Criado 25 de maio de 2007
Ultima resposta 27 de mai. de 2007
Respostas 12
Participantes 7