Mais uma da prova

o que acontece quando tentamos compilar e rodar essa classe?

public class TesteClasse {

static {
System.out.println("vai rodar sem o main() ??? ");
System.exit(0);
}

}

Tipo, roda sim.
O Sytem.out.println está dentro de um bloco static. Blocos statics não precisam de um objeto para rodar. É só criar a classe q ele roda
Compila na boa e imprime normalmente quando executa o .class

É curioso se vc comentar a linha “System.exit(0)”. O bloco static continua rodando, mas logo em seguida o java reclama que não existe o metodo main.

eh que, internamente, o java faz algo mais ou menos assim

Class main = bootClassLoader.loadClass(nomeDaClasse);
...
main.getMethod(....).invoke()....

o loadClass eh o responsavel por executar o bloco estico indiretamente. O java precisa ler a clase antes de ver se o main existe ou nao, esse eh o lance.

esse codigo q eu escrevi ai nao existe, eh soh para ilustrar

Galera ainda não entedi como funciona este metodo…
Alguém pode me explicar como realmente este método é executado, o que a maquina virtual faz quando eu chamo esta classe tecnicamente…

Grato pela ajuda e paciencia

Ae “Pangaiada”… O negócio é o seguinte…

Blocos static { } são executados pelo interpretador logo após a carga da classe ( O ClassLoader carregar e registra a classes, então o interpretador antes de qualquer coisa executa o bloco estático )…

E se dentro do bloco estático, voce executar o System.exit(0), a JVM é “abortada” sem dar sequência na chamada do main(String args[])…

Se dentro do bloco estático, não houver essa chamada, após a carga da classe pelo ClassLoader, o interpretador vai com certeza fazer a seguinte chamada:
Class.main(String args[]), que vai dar mesmo o erro: NoClassDefFoundError, pois a classe nao possui o metodo main esperado.

Sugiro a voces fazerem o SL275 (Preparatório para a Certificação de Programador Java) ou lerem o JVM Specifications 3rd Edition…

Bom estudo…