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??
apenas copiei tua classe e a executei e obtive a saída
noitevasilhamepoteguardacoisascaixa
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…
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…
Calendarc=Calendar.getInstance();intd=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…