Pergunta Static

7 respostas
sakurai

O que acontece se compilar e executar esta classe ? Explique sua resposta.

class Pai{
	Pai() {
		System.out.println("Pai");
	}
}

public class A extends Pai {
	static { System.out.println("Static"); }
	
	{ System.out.println("Bloco"); }

	public A(){
		System.out.println("A");
	}

	public static void main(String[] args) {
		new A();
	}
}

EDIT - Por favor, ponha os tags [ code ] no seu código, para facilitar a visualização pelos outros.

7 Respostas

danieldestro

Static
Bloco
Pai
A

sergiolpf

PEguei o código e executei no Eclipse e o resultado foi o mostrado acima…
mas não entendi pq…

Explicações por favor…

danieldestro

Os blocos estáticos são executados quando a JVM carrega as classes, portanto, antes de qualquer outra coisa do código demonstrado.

Depois é exibido “Pai” porque o construtor da classe filha, implicitamente, invoca o construtor padrão da classe Pai (estudar sobre herança em java).

Depois é exibido “A”, do construtor da classe invocada.

T

E só para completar a explicação do Daniel, o tal código

{ System.out.println("Bloco"); }

é executado por todos os construtores de A, antes da execução do código de A. É como se fosse:

public A(){
               { System.out.println("Bloco"); }
 		System.out.println("A");
 	}

Esse recurso existe, mas é obscuro e não deve ser usado sem uma BOA razão. (Isso é uma sutileza que felizmente não caiu na minha prova).

Agora o bloco static {} (como o static { System.out.println(“Static”); } ) é relativamente bastante usado, porque com ele é possível inicializar variáveis estáticas com chamadas de funções que lançam exceções.

sergiolpf

A parte de chamada implicita a superclasse eu sabia. Não sabia a parte de inicialização do bloco static… ainda não cheguei nesse capitulo hehehe :smiley:

Valeu galera…

I

Na verdade…pelo menos no java 1.5 os resultados são :
Static
Pai
Bloco
A
…isto ocorre pq a primeira coisa que acontece ao entrar no construtor…eh a chamada do construtor da classe pai (super())…após a chamada do construtor da classe pai…os blocos normais (sem ser o static)da classe filha sao invocados…dai resultando na impressão de “bloco” após “pai”.

sakurai

Isso ae pessoal.

Só lembrando que se tivesse mais blocos { } (não static) eles seriam executados na ordem em que eles aparecem no codigo.

Exemplo:

class Pai{
	Pai() {
		System.out.println("Pai");
	}
}

public class A extends Pai {
	static { System.out.println("Static"); }
	
	{ System.out.println("Bloco 1"); }

	public A(){
		System.out.println("A");
	}

	{ System.out.println("Bloco 2"); }

	public static void main(String[] args) {
		new A();
	}

	{ System.out.println("Bloco 3"); }
}

A saída seria:

Static
Pai
Bloco 1
Bloco 2
Bloco 3
A

Falow

Criado 27 de março de 2006
Ultima resposta 28 de mar. de 2006
Respostas 7
Participantes 5