Herança simples
Cachorro e Gato são os dois Animal — latem ou miam diferente, mas comem, dormem e têm nome do mesmo jeito. Reescrever esses comportamentos comuns em cada classe é retrabalho e fonte de bugs quando você precisa mudar algo em todas ao mesmo tempo. Herança existe exatamente pra resolver isso: definir o comportamento comum uma vez, na classe pai.
O PROBLEMA
Animal, Cachorro e Gato com extends e override de fazerSom().
EXEMPLO
Cachorro("Rex").fazerSom() → "Au au!"SOBRE O CONCEITO
extends diz que Cachorro é um tipo de Animal — ele herda tudo que Animal tem e pode sobrescrever métodos específicos com @Override, como fazerSom(). Dentro do construtor de Cachorro, a primeira linha quase sempre precisa ser super(nome), chamando o construtor da classe pai pra inicializar o que é comum antes de configurar o que é específico do cachorro — esquecer essa chamada é o erro mais comum nesse exercício, e o Java geralmente aponta na hora da compilação, então preste atenção na mensagem de erro.
RESOLUÇÃO