Questão envolvendo conceitos de OO

Fala pessoal, me deparei com este exercício em um simulado Whizlabs.
Achei bem capcioso e difícil. Envolve conceitos de OO, como sobrecarga, polimorfismo…
Para quem esta estudando para SCJP ou quer testar seus conhecimentos execute e confira a saída.

[]'s


class SuperBase {
	void print(SuperBase s) {
		System.out.println("Super");
	}
}

class Base extends SuperBase {
	void print(Base b) {
		System.out.println("Base");
	}
}

class Derived extends Base {
	static void print(Derived d) {
		System.out.println("Derived");
	}

}

class Test {
	
	public static void main(String [] args) {
		SuperBase a1 = new SuperBase();
		SuperBase b1 = new Base();
		Base c1 = new Derived();
		Derived d1 = new Derived();

		a1.print(new Base());
		b1.print(new Derived());
		c1.print(new Derived());
		d1.print(new Derived());
	}


}

Caramba, achei muita sacanagem…hehehe.Com certeza seria uma questão perdida no dia do exame…
Alguém saberia explicar o que aconteceu aqui?

Cara… barbada olha so …

a1.print(new Base());

Basicao, o objeto é SuperBase, continuará sendo atribuido a um SuperBase mesmo;

b1.print(new Derived());

O método void print(Base b) da classe base não sobrescreve a classe pai pois não é a mesma ssinatura, lembre-se de co-variantes são para retorno.

c1.print(new Derived());

Mesmo caso acima.

d1.print(new Derived());

Aqui é a propria classe Derived, apontada para um Objeto Derived mesmo…

Até…

ta cheio de questao assim no whizlabs ehhe eu tava errando bastante tive que volta ao cap 1 e cap 2… acho q se tivesse me dedicado bastante a esses cap nao taria errando tanto… podem acreditar… que as pegadinhas ta mais entre cap 1 ate o cap 5 do livro da kathy eu vi uma questao de threads mas na verdade eles pegaram a class principal e colocaram um protected… nada ver com threads, vc apostava que eles queria saber sobre threads… mas tinha a ultima opção la : nenhuma das anteriores hehe!!

A maior pegadinha aí é que o método print da classe Derived é static, então só será usado na última chamada. Se não fosse static, seria chamado na terceira também.

Não muda em nada sendo static ou não…
Derived() não sobreescreve print de Base(), c1 é do tipo Base() então a terceira linha sempre vai cair no print de Base()… :stuck_out_tongue:

Verdade, entendi errado a questão.

Muito boa essa questão…
De primeira eu errei, mas endendi qnd rodei o programa…rs :slight_smile:

eheh essa eh sacanagem mesmo agora tem outra semelhante a essa que usa construtores sobrecarregado eh a mesma sintaxe… so q nao compila pq a subclass q extends a class pai nao sobrecarrega o contrutor declarado na pai…