O conceito que você está usando é o polimorfismo. O polimorfismo é o ato de você declarar algo genérico que recebe atributos mais específicos.
Isso significa que você está pegando algo genérico (Animal) e declarando-o como um cachorro. Você poderia usar o genérico de Animal para declarar outros animas, como a classe Gato, Rato, Passarinho e etc.
Existem diferenças, é claro. Mas aí entra no âmbito de entender que tipo de diferença você quis dizer. Se você tem mais classes de animais, é melhor que use conceitos de polimorfismo, pode te ajudar. Todavia, cada caso é um caso e cada código é um código.
Complementando a excelente explicação da @anon43986829, eu prefiro sempre trabalhar com classes genéricas. No seu caso, imagine que todas as classes que você vai criar contendo espécies de animais possui características como peso e comida. O resto é intuitivo, dentro do conceito de polimorfismo.
Eu comecei a estudar polimorfismo hoje, to estudando a sobrescrita de métodos. O professor passou esse código na aula de heranças. A minha duvida estava na chamada do “construtor cachorro”. Eu quero saber se há alguma diferença entre o chamar usando a super classe animal “Animal caozinho = new Cachorro();” ou a subclasse cachorro “Cachorro feio = new Cachorro();”. Perdão, ainda to bem perdido com tantos conceitos. Acho que o ideal é sempre chamar pela super classe? ne?