A minha dúvida é com relação ao { System.out.print("5"); } e ao {System.out.print("2");}. Como eles não tem o modificador 'static' antes (como o System.out.print("3"); e o System.out.print("6"); ) o que eles significam? Quando eles serão executados?
Eles são executados antes do construtor e na ordem que aparecem.
Na prática, servem para inicializar dados do objeto, tal como o construtor. São mais usados para inicializar alguns valores em classes anônimas, já que elas não admitem um construtor.
evertonsilvagomesjav
Fala Thiago bom d mais cara?
Bom o resultado desse codigo seria: 635421, isso se deve aos blocos de inicializações que foram criados, todos blocos de inicializaçoes staticos iniciam primeiro pq eles fazem parte da classe, e quanto aos blocos de inicializaçoes nao staticos esses inicializam antes do corpo do construtor por isso o resultado 635421.
Quando vc faz:
T
TiagoTC
Perfeito! Muito obrigado pessoal! :thumbup:
D
dio.msg
Cuidado com esse código. Vi essa pegadinha hoje estudando pra scjp
classOut{static{System.out.print("6");}{System.out.print("5");}Out(){System.out.print("4");}}classOuterextendsOut{static{System.out.print("3");}{System.out.print("2");}Outer(){System.out.println("1");}publicstaticvoidmain(String...args){//out antes do construtorSystem.out.print("---");newOuter();}}
e a saída será 63—5421 porque sempre os blocos estaticos são executado primeiro. Mesmo tendo um out antes do construtor Outer()
Para os desavisados o codigo imprimiria —635421
renamed
Somente lembrando que o static é executado antes de todos porém apenas uma vez!
classOut{static{System.out.print("6");}{System.out.print("5");}Out(){System.out.print("4");}}classOuterextendsOut{static{System.out.print("3");}{System.out.print("2");}Outer(){System.out.println("1");}publicstaticvoidmain(String...args){//out antes do construtorSystem.out.print("---");newOuter();newOuter();//colocando-se essa linha, o programa não imprimiria os números 6 e 3 novamente}}
ok?
Jairo_Junior1
Só complementando, mesmo que não seja construído o objeto da classe X, os blocos estáticos de X vão ser executados na ordem que aparecem.
Toda essa parafernália de static, você precisa entender uma vez, depois de entendido, vale pra tudo. :lol:
T
TiagoTC
Galera, eu entendi as explicações. Porém, não vejo sentido em querer colocar código em um bloco {} não static dentro da classe. Por que não fazer isso diretamente em um construtor? Tirando o caso que o ViniGodoy disse (para iniciar valores em classes anônimas) eu não vejo utilidade em se colocar código em um bloco não static dentro de uma classe…