Bloco solto na classe

12 respostas
fuadksd

Nesse código:

class Foo {
        private String bar;

        public Foo(bar) {
               this.bar  = bar
        }

        {
                System.out.println("Bloco solto");
         }
}

o código no bloco solto é executado depois do construtor certo? o que significa esse bloco? qual o objetivo? vi em uns exemplos de validação do vraptor e gostaria de saber.

12 Respostas

FacaNaCaveira

Fala ai fuadksd

Pelo o que lembro esse Bloco Solto, chama-se Bloco Anônimo ele na verdade eu acho que executa antes do construtor, normalmente nele vc pode inicializar itens que vc precisará antes de executar o construtor.
Caso esteja inconrreto peço que me acenem

fuadksd

iso mesmo. executa antes.

ribclauport

FacaNaCaveira eu debuguei aqui coloquei um break point e realmente rodou o bloco solto antes do construtor da classe, depois fiz um teste com a classe que possue o bloco herdando de outra… os construtores das super classes rodam e depois roda o bloco anônimo, e por fim roda o construtor da classe que possue o bloco anônimo.

ViniGodoy

Ele também é o mais próximo que você chegará de um construtor numa inner class anônima.

R

Isso se chama bloco de inicialização estática, é rodado quando a classe é carregada pela JVM. São executados na ordem em que aparecem na classe (pois pode ter mais de um). Portanto, são executados antes de qualquer construtor.

ViniGodoy
rmonico:
Isso se chama bloco de inicialização estática, é rodado quando a classe é carregada pela JVM. São executados na ordem em que aparecem na classe (pois pode ter mais de um). Portanto, são executados antes de qualquer construtor.

No caso, os blocos de inicialização que ele mostrou não são estáticos. Os estáticos tem a palavra static na frente. Abaixo, um exemplo de todos os possíveis inicializadores/construtores, na ordem que são executados:

public class Exemplo {
   //Inicialização estática direta 
   private static var = 10;

   //Bloco de inicialização estático
   static {
   }

   //Inicialização direta
   private var = 10;

   //Bloco de inicialização
   {
   }

   //Construtor
   Exemplo() {
   }
}

É importante lembrar que essa ordem é mantida, independente do local onde apareçam.

Os estáticos são executados só uma vez, quando a classe é carregada.
Tudo que não for estático será executado a cada instância.

ribclauport

Olá Vini desculpe ressucitar o tópico é que resolvendo a questão do mock recorri a sua explicação e tenho uma dúvida no código abaixo:

public class InitTest
{
   public InitTest()
   {
      s1 = sM1("1");
   }
   static String s1 = sM1("a");
   String s3 = sM1("2");
   {
      s1 = sM1("3");
   }
   static
   {
      s1 = sM1("b");
   }
   static String s2 = sM1("c");
   String s4 = sM1("4");
    public static void main(String args[])
    {
        InitTest it = new InitTest();
    }
    private static String sM1(String s)
    {
       System.out.println(s);  return s;
    }
}

tem a saída

a b c 2 3 4 1

Ou seja ele roda a inicialização estática direta e o bloco estático na ordem em que eles aparecem certo?

ribclauport
//Inicialização direta private var = 10; //Bloco de inicialização { }

Vini eu inverti no codigo assim:

{
	  s1 = sM1("3");
   }
   
   String s3 = sM1("2");

OU seja colocando o bloco antes da inicialização direta, e ele rodou antes, pela sua explicação, a inicialização direta não deveria rodar antes?

segue abaixo como eu rodei o código e a saída:

public class InitTest
{
   public InitTest()
   {
      s1 = sM1("1");
   }
   static String s1 = sM1("a");
   
   {
	  s1 = sM1("3");
   }
   
   String s3 = sM1("2");
  
   static String s2 = sM1("c");
  
   static
   {
      s1 = sM1("b");
   }
  
   String s4 = sM1("4");
    public static void main(String args[])
    {
        InitTest it = new InitTest();
    }
    private static String sM1(String s)
    {
       System.out.println(s);  return s;
    }
}

saida:

a
c
b
3
2
4
1

Agora fiquei meio confuso.

ViniGodoy

Tem razão. Pelo visto os blocos e as variáveis rodam na ordem que aparecem. Bom saber.

adriano_si

Esse é um dos assuntos que quando você estuda pra certificação, você sabe ele até de baixo pra cima…

Depois que passa, só estuda de novo quando precisa e ainda assim precisa baixar uma apostila, procurar na net ou recuperar o livro antigo da estante…

Abs []

ViniGodoy

Fato. Até porque em código profissional, você não escreve porquices como misturas de blocos perdidas por toda classe.

Tem muita porquice que você vê na certificação só para saber se vc sabe mesmo o que o Java faria naquela situação esdrúxula.

ribclauport

Obrigado Vini, é muito bom ter você por aqui heim… heheh, obrigado também ao Adriano.

Abraço.

Criado 24 de fevereiro de 2012
Ultima resposta 7 de mar. de 2012
Respostas 12
Participantes 6