Superclasse e Subclasse em Java [duplicado]

Esta pergunta já tem uma resposta aqui:

O que significa “programar para uma interface”? 31 respostas

Para você, isso pode ser muito simples, mas não tenho idéia de qual é a diferença. Eu só quero saber a diferença entre esses dois códigos. Suponha que eu tenha alguns códigos, conforme descrito abaix

A primeira classe é Animal, que será a Superclasse

public class Animal {

    private String name;
    private int weight;
    private String sound;

    public void setName(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }

    public void setWeight(int weight){
        if(weight > 0){
            this.weight = weight;
        } else {
            System.out.println("Weight must be bigger than 0");
        }
    }

    public int getWeight(){
        return weight;
    }

    public void setSound(String sound){
        this.sound = sound;
    }

    public String getSound(){
        return sound;
    }
}

A segunda classe é Dog, que estende a classe Animal

public class Dog extends Animal {

    public void digHole(){
        System.out.println("Dig a hole");
    }

    public Dog(){
        super();

        setSound("bark");
    }
}

A última classe é o WorkWithAnimals que imprimirá a saída

public class WorkWithAnimals {

    public static void main(String args[]){

        Dog fido = new Dog();

        fido.setName("Dadu");
        System.out.println(fido.getName());

        fido.digHole();
        fido.setWeight(-1);
    }
}

Minha pergunta é: qual é a diferença entre Animal fido = new Dog () e Dog fido = new Dog ()?

Desde que o Dog já estende Animal, por que precisamos escrever o código como Animal fido = new Dog (

Ambos imprimem o mesmo resultado, não sã

questionAnswers(6)

yourAnswerToTheQuestion