Blocos de Inicialização

Blocos de inicialização são executados quando a classe é carregada pela JVM, quando se trata de um bloco de inicialização estático, ou quando uma instância é criada, quando se trata de um bloco de inicialização de instância.
Blocos de inicialização não possuem nome e parâmetros, e não retornam nada.
O bloco de inicialização estático só roda uma vez, quando a classe é carregada pela primeira vez. Um bloco de inicialização de instância roda toda vez que uma nova instância da classe é criada.


public class BlocosInicializacao {
      static int var;
      int valor;
     
      //bloco de inicialização estático
      static {
            var = 2;
            /* variáveis de instância não podem
             * ser acessadas dentro de blocos
             * estáticos */
            valor = 4;
      }
     
      //bloco de inicialização de instância
      {
            var = 5;
            valor = 10;
      }    
}


O bloco de inicialização roda logo depois da chamada do método super() em um construtor; em outras palavras, depois que todos os métodos super() das superclasses forem chamados, porém antes do código do construtor.
É permitido ter vários blocos de inicialização em uma classe. Ao contrário de métodos e construtores, a ordem que os blocos de inicialização de instância aparecem em uma classe importa, ou seja, quando na hora de executar os blocos de instância, se a classe tiver mais de um, eles serão executados na ordem em que aparecem na classe, de cima para baixo.
Regras: blocos de inicialização de instancia são executados na ordem em que aparecem; blocos de inicialização estáticos só rodam uma vez, quando a classe é carregada pela primeira vez na JVM; blocos de inicialização de instância rodam toda vez que uma nova instância é criada; e blocos de inicialização de instância rodam depois da chamada do método super() dentro do construtor.
Se houver várias classes na árvore de herança com vários blocos estáticos, todos eles serão executados antes dos blocos de instância.


public class Java {
      //construtores
      Java(int x) {
            System.out.println("Construtor c/ arg");
      }
      Java() {
            System.out.println("Construtor s/ arg");
      }

      //blocos de inicialização
      static {
            System.out.println("Bloco estático 1");
      }
      {
            System.out.println("Bloco de inst. 1");
      }
      {
            System.out.println("Bloco de inst. 2");
      }
      static {
            System.out.println("Bloco estático 2");
      }

      public static void main(String[] args) {
            /* Ordem de execução: blocos estáticos 1 e
             * 2; ao chamar o construtor Java() serão
             * executados os blocos de instância 1 e
             * 2; logo depois o código do construtor 
             * será executado; ao chamar o construtor
             * Java(int x) os blocos de instância
             * serão executados novamente; logo depois
             * o código do construtor com argumento 
             * será executado*/
            new Java();
            new Java(7);
      }
}


Fonte: SCJP Sun Certified Programmer for Java 6 Study Guide

0 comentários:

Postar um comentário