Uma diferença prática é que ao declarar objetos com a classe mãe, você não tem acesso direto aos métodos que são definidos apenas na classe filha.
Por exemplo, com List, ArrayList e LinkedList:
ArrayList<String>declaradaComoArrayList=newArrayList<>();declaradaComoArrayList.ensureCapacity(10);List<String>declaradaComoList=newArrayList<>();// declaradaComoList.ensureCapacity(10); // Não compila!LinkedList<String>declaradaComoLinkedList=newLinkedList<>();declaradaComoLinkedList.addFirst("primeiro");declaradaComoLinkedList.addLast("último");List<String>declaradaComoList2=newLinkedList<>();// declaradaComoList2.addFirst("primeiro"); // Não compila
E qual a utilidade disso?
Na prática você verá que métodos costumam retornar List ao invés de ArrayList ou LinkedList.
Isso por conta de um principio que se costuma seguir de programar para a interface e não para implementação.
A interface nesse caso é List* e as implementações são ArrayList e LinkedList.
Geralmente quando você usa um List, você só se importa que é um grupo de objetos ordernado. Se é um ArrayList ou LinkedList não faz muita diferença pro resto do código.
Dizendo que o método retorna List, você pode trocar a implementação, sem precisar mudar o resto do programa.
Nesse exemplo, List é uma interface do java, mas o mesmo conceito se aplica a classe mãe e filha.
M
matheusYudi1 like
Esse é um conceito chamado de polimorfismo como o abel explicou muito bem, leia esse artigo para entender melhor do que se trata