[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()");
}
se não estou enganado
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
-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
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…