Boa pergunta, sobre blocos de inicialização

2 respostas
vanzella

Analise o codigo:

package api;

public class Metodos {
	static int valor = 10;
	
	static { System.out.println("<estatico> (classe Metodos)"); valor = 50; }
	{ System.out.println("<normal> (classe Metodos)"); valor = 60; }
	
	protected Metodos(){}
	
	protected Metodos(int valor)
	{
		this.valor = valor;
	}
}

package api;

public class SubMetodos extends Metodos{
		
	static { System.out.println("<estatico> (classe SubMetodos)"); valor = 80; }
	{ System.out.println("<normal> (classe SubMetodos)"); valor = 90; }
	
	public SubMetodos(int valor) {
		new Metodos(valor);
	}
}

package api;

public class Teste {
	
	public static void main(String[] args) {		
		new SubMetodos(100);
		System.out.println(SubMetodos.valor);
	}
}

Qual sera a saida?

[quote]

a)	

 (classe Metodos)

 (classe Metodos)

 (classe SubMetodos)

 (classe SubMetodos)

90
b)

 (classe Metodos)

 (classe Metodos)

 (classe SubMetodos)

 (classe SubMetodos)

 (classe Metodos)

60
c)	

 (classe Metodos)

 (classe SubMetodos)

 (classe Metodos)

 (classe SubMetodos)

 (classe Metodos)

100
d)

 (classe Metodos)

 (classe SubMetodos)

 (classe Metodos)

 (classe SubMetodos)

 (classe Metodos)

60

2 Respostas

P

Resposta C

Os blocos estaticos ele são executados uma unica vez qnd a classe é chamada…já os blocos de instancia, são executados a cada nova chamada new

entao tentando debugar:
new SubMetodos(100);
ele chama a subclasse SubMetodos, ela então chama os blocos estáticos da sua super-classe para ser executados (lembrando q eles serao executados na ordem q foram definidos, ou seja, top-down)…nessa, imprime (classe Metodos)

dps disso então a VM volta para para a subclasse SubMetodos, já q nao existem mais blocos estáticos…então executa o bloco estático da sub-classe…(neste caso tb, só existe 1…se existissem mais eles seriam executados da mesma forma, top-down)…

agora chega o momento de executar os blocos de instancia…e os primeiros a serem executados são da super-classe…como só existe 1, ele executa e bvolta para a sub-classe executar os seus blocos de instancia tb…
dps q executou todos os defidos blocos, ai sim, o construtor da subclasse é chamado…e nele tem um new Metodos(valor); …ai, acontece q somente os blocos de instancia serao executados, pois os estaticos - como foi dito- só sao executados 1 unica vez, no momento da chamada da classe…ai o bloco de instancia roda…

agora o 100 eh mostrado pelo fato de variaveis q são definidas dentro dos blocos tem como caracter variaveis locais…(isso para os blocos estaticos - pois nao sao acessados por objetos, neste momento(qnd os blocos estaticos sao executados) ainda nao existe nenhum objeto no heap
e somente depois q o bloco de instancia eh executado q o CONSTRUTOR eh executado…assim definindo o valor 100, onde era 60 (definido pelo bloco de instancia)

acertei??

:stuck_out_tongue:

(debug no papel…rsrsrs)

vanzella

É isso ai! rsrs.
Só uma observação:

pardal_nb:
Resposta C
agora o 100 eh mostrado pelo fato de variaveis q são definidas dentro dos blocos tem como caracter variaveis locais…(isso para os blocos estaticos - pois nao sao acessados por objetos, neste momento(qnd os blocos estaticos sao executados) ainda nao existe nenhum objeto no heap…
e somente depois q o bloco de instancia eh executado q o CONSTRUTOR eh executado…assim definindo o valor 100, onde era 60 (definido pelo bloco de instancia)

com relação as variaveis de blocos, a declaração foi feita na classe

static int valor = 10;

mas é isso ai mesmo…

Criado 3 de dezembro de 2007
Ultima resposta 3 de dez. de 2007
Respostas 2
Participantes 2