Não.
Você está criando um objeto da classe Pai e não da classe Filho.
Como assim?
Quando você tem a declaração
Você está criando o objeto p a partir da classe Filho, mas, definindo como um objeto que da classe Pai. Em outras palavras, seria como se você fizesse um exame de DNA e obtivesse as características do pai, a partir de uma amostra do filho.
Isso fica mais claro quando utilizamos interfaces. É sabido que uma interface precisa ser implementada, logo, se você tentar fazer isso
List<Churrasco> churras = new List<Churrasco>();
Terá um erro, pois, todos os métodos da interface List precisam ser implementados.
Como também é sabido, temos as implementações ArrayList e LinkedList e, além destas, podemos criar as nossas próprias implementações, de acordo com nossa necessidade. Isso nos permite fazer coisas assim
public interface Churrasqueiro{
public void colocarMaisCarne(Carne carne);
}
//E a implementação
public class ChurrasqueiroImpl implements Churrasqueiro{
public Carne retirarCarne(){
if(pedaço.isNoPonto(){
return pedaco;
}
}
public void colocarMaisCarne(Carne carne){
if(isBrasaAtiva(){
carne.setEmProcesso(true);
}
}
}
Se declararmos
Churrasqueiro chu = new ChurrasqueiroImpl();
O método retirarCarne não será visível no objeto chu, visto que, a interface Churrasqueiro não o possui.