Dúvida Certificação

Boa Tarde Pessoal !!

Segue uma dúvida de questão do livro de Sierra.


class Bird {
	{System.out.println("b1");}

	public Bird() {		
		System.out.println("b2");
	}	
	
}

class Raptor extends Bird{
	static {System.out.println("r1");}

	public Raptor() {
		super();
		System.out.println("r2");
	}
	{ System.out.println("r3");}
	static {System.out.println("r4");}
}


public class Hawk extends Raptor {

	public static void main(String[] args) {
		System.out.println("pre");
		new Hawk();
		System.out.println("hawk");

	}

}
No caso, quando eu rodo o método main, o objeto da classe Hawk só seria instanciado na linha 3 não ?? Oque vocês acham que seria impresso ao rodar esse código ??

Respondendo sem testar, eu acho que é:

r1
r4
pre
b1
b2
r3
r2
hawk

Testei agora e minha resposta está correta. Você está com alguma dúvida?

E ai rod !!

rapaz , minha dúvida é a seguinte : o pre não seria impresso antes do r1 e r4 ?? eu estava imaginando que o r1 e r4 só imprimiriam quando o objeto Hawk fosse instanciado(26 linha), pois é nessa hora que os contrutores das classes pai de hawk e seus blocos inicializadores e estáticos seriam chamados.

vlw

Oi diogobra,

Os blocos estáticos tem comportamento diferente daqueles que não são estáticos. Eles são chamados quando a sua aplicação precisa da classe a que eles pertencem. Ou seja, quando o classloader carregar a classe na memória, a jvm já executará cada bloco estático daquela classe. Pra rodar o método main, o classloader terá que carregar a classe Hawk na memória certo? Mas perceba que Hawk extends Raptor, logo Raptor (assim como Bird, pois Raptor extends Bird) também será carregada em memória antes mesmo de o método main ser executado.

vlw rod

obrigado ai pela ajuda. esclareceu bem.

Pessoal,
Vou aproveitar esse topico para colocar a minha duvida.
A questao é a seguinte:

  1. interface Foo {}
  2. class Alpha implements Foo { }
  3. class Beta extends Alpha {}
  4. class Delta extends Beta {
  5. public static void main( String[] args) {
  6. Beta x = new Beta();
  7. // insert code here
  8. }

Aonde está, // insert code here. Eu posso colocar.
Beta b = (Beta)(Alpha)x;
Por que isso funciona?
Nao entendi a explicacao disso.

Abs
Roberto

Roberto,

Funciona mais ou menos assim:

Um objeto do tipo Beta é um objeto do tipo Alpha, ou seja, Para cada objeto x, se x é Beta, então x é Alpha.(não se aplica no sentido contrário, um objeto Alpha pode ou não ser beta)

Então temos o objeto x, que é do tipo Beta logo, também Alpha.

E uma variável b, que é do mesmo tipo que x.

O código que você colocou é equivalente a:

Beta x = new Beta(); Alpha temp = (Alpha) x; // Ou simplesmente Alpha temp = x; Beta b = (Beta) temp;

Cara,

agora que vc desmembrou eu entendi.
blz!
Vlw