Blocos estaticos

3 respostas
M

Eu tenho um arquivo chamado Foo.java que possui mais duas classes: Bar e Baz.

Em uma outra classe, eu instancio um objeto Bar:
Bar bar = new Bar();
A saida gerada eh:

classe Bar inicializada
classe Baz inicializada
Asserts disabled
inicializou classe Bar
construtor Bar

Quando eu instancio um objeto Baz:
Baz baz = new Baz();
A saida gerada eh:

classe Bar inicializada
Asserts enabledaa
inicializou classe Bar
classe Baz inicializada
construtor Bar
construtor Baz

Minha pergunta eh, pq q mesmo instanciando um objeto Baz ele executa primeiro o bloco estatico da superclasse, e so carrega a classe Baz, depois que o bloco estatico de Bar termina. E a segunda pergunta, eh pq q qdo eu instancio um objeto Bar, ele carrega a classe Baz antes mesmo do bloco estatico de Bar ter terminado.

Grato.

Abaixo o codigo da classe Foo.java:

public class Foo {
    
    public Foo() {
    } 
   
    public static void main(String[] args) {
        Baz.testAsserts();
    }    
}

class Bar {
    public Bar () {
        System.out.println("construtor Bar");
    }
    static {
        System.out.println("classe Bar inicializada");
        Baz.testAsserts();
        System.out.println("inicializou classe Bar");
    }
}

class Baz extends Bar {
    static {
        System.out.println("classe Baz inicializada");        
    }
    
    public Baz () {
        System.out.println("construtor Baz");
    }
    static void testAsserts() {
        boolean enabled = false;
        assert enabled = true;
        System.out.println("Asserts "+(enabled ? "enabledaa" : "disabled"));
    }
}
[/code]

3 Respostas

A

Quando você faz referência a uma classe pela primeira vez, seu bloco estático é executado.
Por isso, quando você instancia ou referencia Baz, primeiro excuta o bloco estático da superclasse depois o da própria classe.
No seu caso, como o bloco estático de Bar chama um método estático de Baz, quando você instanciou Bar, inicializou Baz também.

mandrade81

O mais interessante é um exemplo que prova que as coisas devem funcionar assim. :wink:
Lembre-se das aplicações standAlone, onde há o metodo

public static void main(String args[]). Nesse metodo você (muitas vezes) instancia objetos da propria classe que o contém.
Exemplo:

O métode main deve ser static, ou seja, deve ser criado antes da(s) instancia(s) da classe pois ele precisa instanciar objetos da classe que o contém.public class A { private int a; public A(int _a) { a = _a; } public static void main(String args[]) { A a = new A(100); } }

Se falei bobeira me avisem :oops:

Z

Tudo depende da sua vontade de resolver este problema, se vc prestar bem atenção, o if do assert está inverso, e é claro vai dAR false, assim a saida está correta, num é verdade???

Sendo assim manda quem inventou esta questao fazer oq vc já sabe blz?
Japonês maluko!!!

Criado 9 de outubro de 2003
Ultima resposta 13 de out. de 2003
Respostas 3
Participantes 4