Qual a diferença entre tipo e instância de um objeto?

Estou começando a aprender java e já faz um tempinho que aprendi a instanciar objetos no entanto sempre fiz assim: (mesmo tipo e mesma classe)

 ClasseFilha obj1 = new ClasseFilha();

Então hoje me deparei com o “instanceof” e pesquisando a respeito consegui entender mais ou menos sobre como ele funciona, mas me surgiu outra dúvida. Primeiramente eu não sabia que era possível o objeto ser de um tipo e a instancia de outro, então após ter lido a explicação do instanceof comecei a me perguntar: que diferença faz o objeto ser de um tipo ou de outro?
Qual a diferença entre isso:
ClasseFilha obj1 = new ClasseFilha();
E isso:
ClasseMae obj2 = new ClasseFilha();
?

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 = new ArrayList<>();
    declaradaComoArrayList.ensureCapacity(10);

    List<String> declaradaComoList = new ArrayList<>();
//    declaradaComoList.ensureCapacity(10); // Não compila!

    LinkedList<String> declaradaComoLinkedList = new LinkedList<>();
    declaradaComoLinkedList.addFirst("primeiro");
    declaradaComoLinkedList.addLast("último");


    List<String> declaradaComoList2 = new LinkedList<>();
//    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.
1 curtida

Esse é um conceito chamado de polimorfismo como o abel explicou muito bem, leia esse artigo para entender melhor do que se trata

1 curtida