Duvida com static init

12 respostas
FacapeGirl
public class noite{
static{System.out.println("noite");}
public static void main(String [] aff){

new caixa();
}

}
class vasilhame extends noite{
static{System.out.println("vasilhame");}
}
class pote extends vasilhame{
static{System.out.println("pote");}
}
class guardacoisas extends pote{
static{System.out.println("guardacoisas");}
}
class caixa extends guardacoisas{
static{System.out.println("caixa");}
}

Bom pessoal o cenário acima foi o que eu testei em casa,tou tentando tirar a SCJP 5.0(nao tenho ingles =/),
e tou sem entender ao certo como a classe é carregada!!Porque o init static de noite não é invocado nem pela cadeia de construtores nem pelo
metodo main que é estatico e por assim ser obrigaria o carregamento da classe pela JVM??

12 Respostas

drsmachado

Olá,

apenas copiei tua classe e a executei e obtive a saída

noite
vasilhame
pote
guardacoisas
caixa

Todos os “extends” vão chamar, mesmo que não esteja explicitado o construtor da classe Pai.

...
super();
...

Por isso, obrigatoriamente, a primeira saída será “noite”.

jpjcjbr

Bom dia FacapeGirl, tudo bem?

Eu executei o seu código aqui e ocorreu tudo como esperado: a saída foi:

noite
vasilhame
pote
guardacoisas
caixa

acho que está correto

como vc ta executando seu código?

FacapeGirl

Desta forma mesmo,engraçado que em casa não chamou o static init da primeira classe da árvore…cheguei a achar que era por causa
do método main que estava nela…vocês mantiveram ele na classe noite?

drsmachado

Sim, apenas copiei e colei seu código, sem qualquer alteração.
Sem o código main, ele foi executado, mas informou Não há nenhum método principal na classe: caixa

marcelo.bellissimo

Como você está fazendo pra rodar esse exemplo? Aqui funcionou sem problemas…

noite vasilhame pote guardacoisas caixa

FacapeGirl

Deixa pra lá…fui eu ou meu pc,alguem usou alguma coisa estranha!!
Mas aproveitando a deixa,fala la do static init no livro de Kathy que ele eh invocado quando
a classe é carregada,e e isso acontece quando?

drsmachado

A execução dos statics ocorre antes da chamada do construtor da classe (aquela que obrigatoriamente chama super()).

FacapeGirl

Mas quando eu uso um membro estatico os static init de todas as super classes(no meu caso noite nao aconteceu)
são executados…
Coloque um static int na ultima subclasse de noite e invoque ele pra voce ver…

drsmachado

Você diz assim:

public class noite {
    static {
        System.out.println("noite");
    }

    public static void main(String[] aff) {

        new caixa();
    }

}

class vasilhame extends noite {
    static {
        System.out.println("vasilhame");
    }
}

class pote extends vasilhame {
    static {
        System.out.println("pote");
    }
}

class guardacoisas extends pote {
    static {
        System.out.println("guardacoisas");
    }
}

class caixa extends guardacoisas {
    static int r = 1;
}

?

Saída:

noite
vasilhame
pote
guardacoisas

FacapeGirl

Sim,mas invez de criar uma instancia de caixa,realizar alguma operação com a variável de classe,mas matendo o static init em caixa…
Existe outros criterios para que classes sejam carregadas pela JVM?
Alem de acessar membros static ou criar instancias?

drsmachado

Um bom exemplo disso são os enums…
Você chama um valor que é constante.
Outro exemplo, você tem alguns recursos que podem ser acessados diretamente.
Da classe Calendar, por exemplo, podemos acessar algumas statics…

Calendar c = Calendar.getInstance();
    int d = c.AM;

No caso, a static AM, do tipo int será atribuída à variável d.

FacapeGirl

Olha só,a classe que tem o método main,ele não invoca os static init…testei varias vezes em casa e posso trazer um print pra vc ver…inclusive as classes super da que posssui o metodo main…

Criado 27 de janeiro de 2011
Ultima resposta 28 de jan. de 2011
Respostas 12
Participantes 4