Duvida STATIC [Alguém se arrisca?]

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?

Ninguém?

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.

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?

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

Não seria isso?

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

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.

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.

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

Muito bom takeshi10 e ViniGodoy.

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

Valeu mesmo.

agora me surgiu uma dúvida:

static { 

// código

}

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

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

vlw

[ ]