terça-feira, 27 de agosto de 2013

perguntas exames SCJP - blocos de Inicializacao

perguntas exames SCJP - blocos de Inicializacao




    Blocos de inicializacao rodam quando a classe e carregada pela primeira vez(um bloco de inicializacao estático) ou quando a instancia e criada(um bloco de inicializacao de instancia), como podemos ver no exemplo:

package outro.pacote.teste.blocos.inicializacao;

public class SmallInit
{
    static int x ;

    int y ;

    static{x = 7 ;} //bloco de inicializacao estatico

    {y = 8;} //bloco de inicializacao de instancia

}


Como podemos ver, a sintaxe dos blocos de inicializacao e bem complexa. Eles não tem nomes, não usam argumentos e não retornado nada. Um bloco de inicializacao estático roda uma vez quando a classe e carregada pela primeira vez. Um bloco de inicializacao de instancia roda sempre que uma nova instancia e criada. O código de blocos de instancia roda logo depois da chamada a super() em um construtor, ou seja, depois que todos os superconstrutores tenham rodado.

Você pode ter muitos blocos de inicializacao em sua classe. E importante notar que, ao contrario de métodos construtores, a ordem em que os blocos de inicializacao aparecem em uma classe faz diferenca . Quando chega a hora de os blocos de inicializacao executarem, se uma classe tiver mais de um, eles rodarão na ordem em que aparecem no arquivo da classe.. Em outras palavras de cima para baixo.

Podemos ver outro exemplo:


package outro.pacote.teste.blocos.inicializacao;

public class Super
{

  
      System.out.println(" Super bloco Super ");
  }


  Super()
  {
      System.out.println("Metodo Construtor Super Super ");
  }

}

////---------------------


package outro.pacote.teste.blocos.inicializacao;

public class Teste extends Super
{
   static{ System.out.println( " TESTE static 1 ");}

   
      System.out.println( "TESTE block teste ");
   }

static { System.out.println( "TESTE static 2 ");}

   Teste()
   {
      super(); //chamada é implícita

      System.out.println( "Metodo Construtor TESTE teste ");
   }

}



///------------------

package outro.pacote.teste.blocos.inicializacao;

public class Main
{
  public static void main(String[] args)
  {
     new Teste();
  }
}





Qual sera a saida???!!!:
Para saber as respostas, lembre-se das regras:
  • Os blocos de inicializacao rodam na ordem em que aparecem.
  • Os blocos de inicializacao estáticos rodam uma vez, quando a classe e carregada pela primeira vez.
  • Os blocos de inicializacao de instancias rodam sempre que uma instancia de classe e criada.
  • Os blocos de inicializacao de instancias rodam depois da chamada que o construtor faz super().


...
...
...
...

 TESTE static 1 
TESTE  static 2  
 Super bloco Super 
Metodo Construtor Super Super 
TESTE  block teste  
Metodo Construtor  TESTE  teste  



Outro teste, qual sera a saida??

package outro.pacote.teste.blocos.inicializacao;

public class Init
{

   public Init(int x)
   {
      System.out.println("1-arg const ");
   }
   public Init()
   {
      System.out.println("no-arg const");
   }
   static
   {
      System.out.println(" 1st -static init ");
   }
   {
      System.out.println("1st instance init");
   }

   {
      System.out.println("1nd instance init");
   }

   static
   {
      System.out.println(" 2nd -static init ");
   }
   public static void main(String[] args)
   {
      new Init();
      new Init(7);
   }

}


Resposta:
Para saber as respostas, lembre-se das regras:


  • Os blocos de inicializacao rodam na ordem em que aparecem.
  • Os blocos de inicializacao estáticos rodam uma vez, quando a classe e carregada pela primeira vez.
  • Os blocos de inicializacao de instancias rodam sempre que uma instancia de classe e criada.
  • Os blocos de inicializacao de instancias rodam depois da chamada que o construtor faz super().
..
..
..
..
 1st -static init 
 2nd -static init 
1st instance init
1nd instance init
no-arg const
1st instance init
1nd instance init
1-arg const 





Nenhum comentário:

Postar um comentário