É recomendado instanciar com tipo da superclasse ou subclasse?

Na seguinte situação, é recomendado instanciar assim “Livro p=new Livro();” ou “Produto p=new Livro()”

public Class Produto{
private String nome;

public void setNome(){

}

public Class Livro extends Produto{
private String autor;
public void setAutor(){

}
}

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.

2 curtidas

Então vai depender da situação né? achei que fazendo “Produto p=new Livro();” era uma forma de encapsulamento

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.