Dúvida static

7 respostas
T

Dado o seguinte código, porque ele imprime 635421 ?

class Out
{
	static { System.out.print("6"); }
	{ System.out.print("5"); }

	Out(){ System.out.print("4");}
}

class Outer extends Out
{
	static { System.out.print("3");}
	{System.out.print("2");}

	Outer(){ System.out.println("1");}

	public static void main(String ... args){
		new Outer();
	}
}

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?

Obrigado.

7 Respostas

ViniGodoy

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

Perfeito! :smiley: Muito obrigado pessoal! :thumbup:

D

Cuidado com esse código. Vi essa pegadinha hoje estudando pra scjp

class Out
{
        static { System.out.print("6"); }
        { System.out.print("5"); }

        Out(){ System.out.print("4");}
}

class Outer extends Out
{
        static { System.out.print("3");}
        {System.out.print("2");}

        Outer(){ System.out.println("1");}

        public static void main(String ... args){
        //out antes do construtor
        System.out.print("---");
        new Outer();
        }
}

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!

class Out
{
        static { System.out.print("6"); }
        { System.out.print("5"); }

        Out(){ System.out.print("4");}
}

class Outer extends Out
{
        static { System.out.print("3");}
        {System.out.print("2");}

        Outer(){ System.out.println("1");}

        public static void main(String ... args){
        //out antes do construtor
        System.out.print("---");
        new Outer();
        new Outer(); //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

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…

Criado 12 de janeiro de 2010
Ultima resposta 12 de jan. de 2010
Respostas 7
Participantes 6