Construtor pegadinha

7 respostas
ricardolecheta

qual a saída desta?

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

}

7 Respostas

R

ai vai um palpite…

vai sair:
constructor
99
Base.amethod()

falow

urubatan

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:

C
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

urubatan

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

L

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…

Hempx

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

S

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

Criado 30 de outubro de 2003
Ultima resposta 31 de out. de 2003
Respostas 7
Participantes 7