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.