Blocks alguem sabe como funciona

Aew pessoal estava estudando java aqui em casa e derrepente apareceu esse codigo

class Init {
  Init(int x) { System.out.println("1-arg const"); 
  Init() { System.out.println("no-arg const"); }
  static { System.out.println("1st static init"); }
  { System.out.println("1st instance init"); }
  { System.out.println("2nd instance init"); }
  static { System.out.println("2nd static init"); }
  public static void main(String [] args) {
    new Init();
    new Init(7);
  }
}

quando eu executo sai no console :

1st static init
2nd static init
1st instance init
2nd instance init
no-arg const
1st instance init
2nd instance init
1-arg const

oque acontece aqui eu fiz um testes aqui e nao entendi muito bem como funciona nem a utilidadae … se alguem poder me ajudar agradeço desde ja!
flw!

Olá,

Vamos primeiro as definições:

static { System.out.println(“1st static init”); }
static { System.out.println(“2nd static init”); }
As duas linhas acima são blocos de inicialização de CLASSES! (vamos chamar de BIC)

{ System.out.println(“1st instance init”); }
{ System.out.println(“2nd instance init”); }
As duas linhas acima são blocos de inicialização de INSTÂNCIA! (vamos chamar de BII)

Init(int x) { System.out.println(“1-arg const”);
Init() { System.out.println(“no-arg const”); }
As duas linhas acima dispensam comentários, são simples construtores.

Os BIC são executados quando a classe é carregada no JVM pela primeira vez e depois
disso não são executados novamente, eles independem de instância, basta que a classe que os
contém seja referenciada em algum ponto (caso em que a classe é carregada pelo JVM) que eles
serão executados, e por esse mesmo motivo fica fácil de entender porque sua execução é a
primeira coisa que acontece no seu código, antes mesmo de executar o método main, a classe
já precisa estar carregada no JVM, e por esse motivo antes que main execute qualquer coisa,
os BIC já rodaram. A última observação com relação aos BIC é que se houver mais de um na mesma
classe eles são executados na ordem em que aparecem.

Os BII são executados sempre que vc cria uma instância, vc criou duas instâncias no main,
por isso, eles são executados duas vezes (uma para cada instância). Eles tem precedência em
relação aos contrutores, por isso, antes que seu contrutor execute qualquer coisa, todos os BII
já terão sido executados, isso explica a saída de seus BII antes da saída do contrutor. Assim
como os BIC, os BII são executados também na ordem em que aparecem, no caso de haver
mais de um na classe.

Com a explicação acima, vc deve ter entendido porque os BIC só executaram uma vez (a classe
só é carregada uma vez), e porque os BII executam sempre que se criam novas instâncias (o nome
já diz: são blocos de INSTÂNCIA), então deixo uma pergunta para vc: qual será a saída se no
método main retirarmos a criação das duas instâncias e colocarmos uma saída simples, como
por exemplo: “System.out.println(“método main”);” ?

E pra complicar um pouco mais, o que acontece se fizermos sua classe Init herdar da classe abaixo?
class PreInit{
PreInit(){ System.out.println(“PreInit no-arg constructor”); }
static { System.out.println(“PreInit static init”); }
{ System.out.println(“PreInit instance init”); }
}

A saída vc pode testar e obter ai, e a explicação dessa saída é: todas as regras mencionadas acima
são executadas primeiro para as superclasses e depois para a subclasse.

Independente de vc querer tirar a certificação ou não, eu recomendo que vc leia o livro
“SCJP certificação Sun para programador Java 5” da Kathy Serra e Bert Bates, com certeza
a explicação que tem no livro é mais didática e mais detalhada que a minha.

Abs e boa sorte

CARA valeu mesmo agora eu entendi…
e eu ja to lendo o livro da katy