Ola, Eduardo!
Dois erros:
1º erro: 
c.x vai dar erro porque o c esta sendo passado como paramentro pelo metodo equals e no caso é um Object e a classe Object não tem um atributo x.
Como segue o codigo abaixo:
public boolean equals(Object c) {
        return c.x==x;
    }
Para resolver teria q fazer um cast no c. 
Ex.:
public boolean equals(Object c) {
        return ((C)c).x==x;
    }
2º erro.
A Classe D não é filha da Classe C nem de outra Classe que seja fila da Classe C. Nesse caso o compilador vai reclamar porque ele vai ver que a Classe C não é Filha da Classe D.
C b = new D();
Sobre a Ordem o compilador vai reclamar primeiro dos tipos incompatíveis no metodo equals depois ele vai reclamar do momento que tenta fazer um new do tipo D para o Tipo C.