Construtor pegadinha

qual a saída desta?

[code]class Base
{
int i = 99;
public void amethod()
{
System.out.println("Base.amethod()");
}

Base()
{
	amethod();
}

}

public class Derived extends Base
{
int i = -1;

public Derived(){
	System.out.println("constructor");
}

public static void main(String argv[])
{
	Base b = new Derived();
	System.out.println(b.i);
	b.amethod();
}

public void amethod()
{
	System.out.println("Derived.amethod()");
}

}
[/code]

ai vai um palpite…

vai sair:
constructor
99
Base.amethod()

falow

Base.amethod()
constructor
-1
Derived.amethod

se não estou enganado :slight_smile:
pois a primeira linha em qualquer construtor é a chamada ao contrutor do ancestral, depois roda o codigo do construtor
e é impresso -1 em vez de 99, pois a variavel i impressa é a da classe derived, ja que a da classe base foi “escondida” por esta, e a variavel b aponta para uma instancia da classe Derived
e por fim, é chamado o metodo amethod da classe derived, novamente por que é uma instancia desta classe que esta contida na variavel b, mesmo esta variavel sendo do tipo Base :slight_smile:

Derived.amethod()
constructor
-1
Derived.amethod()

sequência da construção do objeto:

-construtor da Derived
–construtor da Base
—executa o construtor da Object
–executa o resto do construtor da Base
-executa o resto do construtor da Derived

O método amethod() no construtor da Base invoca o método sobrescrito na subclasse.(Virtual Method Invocation - VMI)

System.out.println(b.i); //imprime o valor do atributo i da classe Derived

b.amethod(); idem ao amethod() anterior - VMI

que chato, errei feio,

o output copiado do console :slight_smile:

Derived.amethod()
constructor
99
Derived.amethod()

esqueci do polimorfismo na primeira chamada a amethod (no construtor de Base)
e ainda não entendi por que o 99, achei que a variavel de Derived deveria esconder a de Base

imprime 99 pq b é uma referencia do tipo Base e nao da subclasse…
e variaveis de instancia como i agem diferentes dos metodos…
se eu estiver errado por favor me corijam…

porra…
alguem sabe uma explicacao melhor para esse…
porque nao entendi naum… inda mais esse 99…

imprime 99, pq a referencia eh pra classe Base. Ai imprime 99
em relacao ao Derived, pq o metodo foi reescrito