Eu não consegui entender porque a Classe B não compila:
abstract class B { abstract void x() { System.out.println(y()); } abstract int y(); } abstract class C extends B { int y() { return 1; } } class D extends C { int y() { return 2; } } class A { public static void main(String[] args) { D d = (D) (C) new D(); d.x(); } }