Você só está instanciando com o tipo da subclasse.
Se fosse instanciar a superclasse, você faria new Produto().
Agora se a variável precisa ser do tipo da superclasse ou do tipo da subclasse, vai depender do seu código.
Se você precisa acessar membros que só existem na subclasse, a variável deveria ser do tipo da subclasse, senão pode ser do tipo da superclasse.
H
Henrique_Santos2
Então vai depender da situação né? achei que fazendo “Produto p=new Livro();” era uma forma de encapsulamento
S
staroski
Não, o nome disso é polimorfismo. Você tem uma variável de um tipo de dado (Produto) mas na verdade ela referencia outro tipo (Livro).
Encapsulamento é você esconder características de sua implementação (geralmente com a palavra reservada private) e fornecer métodos para obter as informações que deseja.