Blocos estáticos

6 respostas
J

li em uma tutorial, que em uma classe, é possível definir blocos estáticos, os quais serão executados quando a classe for instanciada, da seguinte forma:

public class Teste{

    static{
        int x = 5;
    }

    public static void main(String[] args){
        System.out.println(x);
    }

}

Minha dúvida é:
Se um bloco estárico é executado quando uma classe é instanciada, qual a diferença entre um bloco estático e o construtor da classe, já que a funçao do construtor também é essa?

grato

Julio Romano

6 Respostas

BrunoBastosPJ

Olha só em primeiro lugar esse cósdigo ai não compila porque x no caso é ma variável de bloco e não da classe. Blocos estáticos não são como construtores eles inicializam variáveis estáticas que são comuns para todas as instâncias da classe, ao contrátio de variáveis inicializadas em um construtor. exitem blocos de inicialização que não de instâncias também! Esse blocos são executados depois que todos os super contrutores são chamados para cada nova instância da classa (Cada chamada new).

J

O bloco estático não é executado quando a classe é instanciada, e sim quando ela é carregada. O bloco estático geralmente é usado para inicializar atributos estáticos.

K

cara eu nao intendi ainda onde que é utilizado o bloco estatico
algueim tem um exemplo para citar?

B

“k3rn3lx”:
cara eu nao intendi ainda onde que é utilizado o bloco estatico
algueim tem um exemplo para citar?

já programou em C? Se sim vai ser bem fácil:

o public static void main (String[]args) {

nada mais é que o seu main na linguagem C, entendeu agora?

É o seguinte, um programa feito em Java é uma pilha de classes, ou seja, no programa existe várias classes, classes dentro de classes… e quando ela for executada o Java Virtual Machine vai se perguntar:

  • nossa senhora! Quantas classes tem aqui, por onde começo a executar o programa?

aí vei a definição e responde:
-ora JVM, comece por aqui, pelo static.

acho que não dá pra explicar melhor

L

Imagino que o bloco estatico que ele quer eh aquele definido na classe, como exemplo que ele deu.

Então, vamos la, alguns objetos estao prontos para serem usados assim que forem criados

Objeto x = new Objeto()

logo depois de dar o new vc faz o que quizer com ele, ele esta la, bunitinho, então se quizesse ele estatico apenas faria:

public final static Object x = new Object()

então, mas alguns outros, não é soh criar e pronto, vc pode querer fazer alguma coisinha a mais nele, setar alguma propriedade, iniciar alguma coisa, etc, sem que vc possa fazer diretamente no contrutor. Exemplo, suponha que vc quer criar um objeto “X” que tem atributo inteiro “y”, e esse atributo vc quer que seja 7, mas não tem como setar logo de cara no construtor, vc faria assim certo:

X o = new X();
o.setY(7);

Mas agora imagina que vc quer um Objeto desses X como constante estatico numa classe sua, mas quer que essa constante tenha valor Y como 7, como vc esse atributo estatico?! ai que vc usa os blocos estaticos:

public static final X o = new X();
static {
o.setY(7);
}

porque sendo estatico, esse atributo não precisa de objeto, então não tem onde vc colocar na classe para iniciar ele, não adianta colocar em método estatico porque pode ser que quem esteja usando naum chame, naum adianta colocar no contrutor, porque quem esta usando pode ser que não crie nenhum objeto, então tem que colocar num bloco estatico, ai vc tem certeza de que se vc fizer um programa assim apenas:

public class X {
  public int y;
}

public class KK {
  public static final X o = new X();
  static {
    o.y = 7
  }
  public static void main(String[] args) {
    Sysout(KK.o.y);
  }
}

sabera que o valor de Y eh 7 do objeto X que eh estatico na classe KK. Se não tiver o bloco estatico, vc naum consegue iniciar esse atributo em nenhum outro lugar, faz um teste.

Isso pode ser usado por exemplo em ServiceLocator (pelo menos eu usei eheh), para iniciar objetos estaticos que lancem exceção e tratar elas, etc…

18:00, final de semana, chega de escrever heheh foi mau se naum deu para explicar bem, mas eh que fiz corrido

valeu! espero ter ajudado

K

vlw aih cara pela explicaçao…
deu pah intende tudo sim

vlw msm

Criado 31 de outubro de 2006
Ultima resposta 3 de nov. de 2006
Respostas 6
Participantes 6