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();
}
}
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!!!