Prezados boa tarde! Não entendi o exercício cujo o código está abaixo. Compreendo que com o objeto instanciado é o D e que o resultado impresso é 'b', mas o que não entendo o por quer de não dar erro em tempo de execução visto que o método y existe na classe B e foi sobre-carregado na D.(Já que a regra da sobre-escrita diz que o retorno tem que ter o mesmo tipo pelo que entendo).
abstract class B {
void x() {
System.out.println(y());
}
Object y() { return "a"; }
}
abstract class C extends B {
abstract String y();
}
class D extends C {
String y() { return "b"; }
}
class A {
public static void main(String[] args) {
D d = (D) (C) new D();
d.x();
}
}