Conceito Bloco Static e Constructor

Boa tarde Pessoal

Gostaria de tirar uma dúvida no seguinte código abaixo

  1. SuperClasse:
public class StaticSuper {
	
	static {
		System.out.println("Super Static block");
	}
	
	StaticSuper() {
		System.out.println("Super Constructor");
		
	}
	
	
}
  1. SubClasse:
public class StaticTests extends StaticSuper {
	
	static int rand;
	
	static {
		
		rand = (int) (Math.random() * 6 );
		System.out.println("Static block" + rand);
	}
	
	StaticTests() {
		System.out.println("constructor");
		
	}
	
	public static void main(String[] args) {
		System.out.println("in main");
		StaticTests st = new StaticTests();
	}
	
}

Bem a minha dúvida é o seguinte, sei que quando instancio um objeto de uma subclasse o construtor da superClasse é chamada primeiro e assim sucessivamente até o topo da hierarquia, sei também que um bloco static e sempre executado antes da criação do objeto.
O código acima exibe primeiro as instruções do bloco static da superClasse em seguida o bloco static da subclasse só depois as instruções contidas nos construtores. Não entendi como a VM entendi que existe um bloco static em uma classe acima.

Obrigado.

Como assim “entende”?
Quando a JVM carrega uma classe, ela é obrigada a carregar também tudo que ela referencia, por exemplo, sua superclasse.

 	static {
 		System.out.println("Super Static block");
 	}
 	static {
 		
 		rand = (int) (Math.random() * 6 );
 		System.out.println("Static block" + rand);
 	}

Naum deu pra entender sua pergunta direito naum cara…
como assim entende??? ela foi criada assim… rs :?

Desculpe não ficou muito claro.

Seguinte sempre que eu tiver um bloco static em um superclasse esse vai ser executado antes de qualquer coisa? Mesmo antes dos construtores das Subclasses?

Obrigado

Entao, vc precisa diferenciar o conceito de carregar uma classe e instanciar uma classe.
Carregar uma classe é carrega-la pra memoria (O ClassLoader do java faz isso) ao passo q instanciar uma classe é usar o operador “new”.

Os construtores soh sao chamados qdo vc usa o “new”, nunca em outra ocasião.
Os blocos static sao executados qdo sua classe é carregada pelo Java. E isso só ocorre uma vez.
Faça o teste: de varios new na sua classe e vc vai ver q o bloco static soh eh executado uma vez, ao passo q os construtores nao.

Respondendo a sua pergunta: sim, os blocos static sao sempre executados antes dos construtores.

1 curtida

ela não entende, ela simplismente vê e executa… (oO)