As duas formas são corretas, só que nas formas passadas existem diferenças:
1) Forma
Animal a = new Cachorro();
Nesse caso a variavel a (do tipo Animal) só vai conter os métodos da classe Animal.
2) Forma
Cachorro c = new Cachorro();
Nesse caso Cachorro que herda do de Animal, vai conter todos os métodos de Animal e também os métodos de Cachorro.
Exemplo:
package Example;
public class Animal {
private String nome;
private String cor;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCor() {
return cor;
}
public void setCor(String cor) {
this.cor = cor;
}
}
package Example;
public class Cachorro extends Animal {
private boolean peludo;
public boolean isPeludo() {
return peludo;
}
public void setPeludo(boolean peludo) {
this.peludo = peludo;
}
}
Animal a = new Cachorro();

e
Cachorro c = new Cachorro();

Diferença é que a primeira instância animal não tem peludo, mesmo sendo instânciada da classe Cachorro, já na segunda à instância cachorro terá todos os métodos herdados da classe Animal.
Nesse link Conversão de Tipos ou Casting - Java, tem o complemento das Conversão e Casting especifico para Java e tem correlação a sua duvida.