Qual a saida? (certificacao)

class X
{
Y b = new Y();

X()
{
System.out.print(“X”);
}
}

class Y
{
Y()
{
System.out.print(“Y”);
}
}

public class Z extends X
{
Y y = new Y();

Z()
{
System.out.print(“Z”);
}

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

}

[code]
class X{
Y b = new Y();

X(){
	System.out.print("X");
}

}

class Y{
Y(){
System.out.print("Y");
}
}

public class Z extends X {
Y y = new Y(); // 3º - Nova instancia de Y, imprime ‘Y’

Z()	{
	// 1º chamada implicita de super() que cria uma nova instancia de Y e imprime 'Y'.
	// 2º depois de Y ser criado o construtor de X é chamado e imprime 'x';		
	System.out.print("Z"); // 4º imprime Z
}

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

}[/code]

Resp: YXYZ

sim roger (rabit) … é isso … mas pela minha teoria seria YYXZ

onde errei? Não entendi pq na 1a chamada de super() ele primeiro instancia Y (imprimindo Y) e depois executa o construtor e para a classe Z ele nao faz isso tb (primeiro instanciando Y e depois indo pro construtor). :?

Quando é dado:
new Z();
uma nova instancia de X é criada.
X tem como atributo Y, q cria uma nova instancia de Y ( 1º exibido ).

O construtor de X é chamado, o obj é criado e exibe X ( 2º exibido ).

Parecido com X, Z tem um atributo Y, q cria uma nova instancia de Y, q chama seu construtor, q exibe Y novamente ( 3º exibido).

e por fim,

o construtor de Z é chamado, e exibe Z (4º exibido).

bem é ± isso.

1º os dados menbros sao declarados, e neste caso, sao logo instanciados.

2º os construtores são chamados.

e como tem herança, é acrescentada a essa ordem a superClasse.

[quote=“egcoelho”]Quando é dado:
new Z();
1º os dados menbros sao declarados, e neste caso, sao logo instanciados.

[quote]

Pois é … quando dou um new Z() os dados membros não deveriam ser declarados antes da chamada do construtor? … Z tem um membro Y que imprimiria Y, ai chamaria o super imprimindo Y (para o dado membro) e X (para o construtor), depois sim imprimiria o Z. Resultando em YYXZ

eheheh sei que to dando murro em ponta de faca pq a saida é realmente YXYZ mas eu não peguei pq o membro Y de Z não sai antes super() (sai logo depois) …

Não esquenta a cabeça não.
O objetivo é realmente esclarecer a duvida.
Vamos lá.

quando damos new z();

primeiramente é criada a superclasse X.
q cria Y (dado membro) e logo instancia (new Y()) chamando seu construtor e imprime ‘Y’.
Logo apos a criada de Y, X chama seu construtor e imprime ‘X’.

Lembrando, isso acontece por q X é a SuperClasse de Z.

Z, por sua vez, tem o Y (dado membro), q chama seu construtor, q exibe ‘Y’.

e logo depois, z executa seu construtor.

obs: é realmente complicado de se entender.

aaaaa bão … agora entendi :lol:

Eu estava perdido porque não sabia que antes de realmente criar o objeto Z a superclasse é instanciada (mais ou menos) e não somente o super() é chamado …

Vixe, essa valeu, nunca mais vou esquecer esse comportamento. 8)

Muuuuuito obrigado!

[]s

Deee naaadaaa!!!