Dúvida Java - Polimorfismo

Olá,

Estou realizando alguns exercícios em Java, porém me deparei com um que não entendi a resposta, se poderem me explicar o motivo de imprimir 2, serei grato.

class D extends C {
	void x() {
		System.out.println(1);
	}

	void y(C b) {
		x();
	}
}

class C extends B {
	void x() {
		System.out.println(2);
	}
}

class B {
	void x() {
		System.out.println(3);
	}

	void y(B b) {
		b.x();
	}
}

class A {
	public static void main(String[] args) {
		new B().y(new C());
	}
}

O C tem uma herança da classe B, onde C reescreveu o método x, sendo que esse método prevalece o seu comportamento e não o de B.

Referencia Wikipédia:
frase “O polimorfismo é caracterizado quando duas ou mais classes distintas tem métodos de mesmo nome, de forma que uma função possa utilizar um objeto de qualquer uma das classes polimórficas, sem necessidade de tratar de forma diferenciada conforme a classe do objeto.”.

Resumindo o que sempre prevalece é a instância que a gerou, se ela não tivesse o método x executaria o de B.

Além desse conceito leia os links abaixo que falam sobre reescrita de método ou overload

Leia:

Vamos lá, sua classe A contém o método main. Este, por sua vez, invoca o método y da classe B.
O método y, por sua vez, recebe um objeto do tipo B como parâmetro e invoca o método x.
O método x, da classe B, printa 3.

Sua classe C, herda da sua classe B. A classe C, possuí, também, um método x, que, por sua vez, printa 2.

Aí que está a sacada. O método x da classe C, sobrescreve o da classe pai, no caso, a classe B.
E repare no main:

public static void main(String[] args) {
     // você está invocando o método 'x' da classe C, que sobrescreveu o 'x' de B, pois o parâmetro passado é a classe 'C'
     new B().y(new C());
}

Obrigado senhores, agora tudo faz sentido.

@Dragoon
Obrigado pelos links.

1 curtida