Bom dia,
Galera vamos tentar esclarecer melhor isso.
Quando você utiliza Herança, todas as subclasses de uma superclasse herdarão atributos e comportamentos. Com isso, se temos uma superclasse Conta, que tem um método imprimir, todas as filhas de Conta poderão utilizar este método, e não é necessário que imprimir seja escrito nas classes filhas.
Se você apaga o método imprimir de Conta, a superclasse não tem mais o comportamento, logo não tem como as subclasses herdarem. Com isso, se você vai e escreve imprimir na ContaCorrente por exemplo, é um comportamento apenas dela, a superclasse Conta não tem como conhecer. Não é bidirecional esta relação.
Um classe filha sabe o que a classe pai faz, mas a classe pai não sabe nada do que as classes filhas fazem ok.
Quanto ao Polimorfismo, vamos ser claros:
Conta cc = new ContaCorrente();
Isso não é interpretado como Conta. O Polimorfismo permite que você referencie (a expressão à esquerda é apenas a variável de referência) um objeto como outro (através da Herança e da implementação de Interfaces). Mas em tempo de execução, a instância criada é de um objeto ContaCorrente, logo por mais que a referência seja de Conta, tudo que o objeto ContaCorrente for capaz de fazer, ele conseguirá fazer.
Caso tenha ficado alguma dúvida, rodem este exemplo:
public class Conta {
private int numero;
private int agencia;
private double saldo;
public Conta(int numero, int agencia, double saldo) {
this.numero = numero;
this.agencia = agencia;
this.saldo = saldo;
}
public void imprimir() {
System.out.println("Isso é uma CONTA!");
}
}
public class ContaCorrente extends Conta {
private String nome;
public ContaCorrente(int numero, int agencia, double saldo, String nome) {
super(numero, agencia, saldo);
this.nome = nome;
}
@Override
public void imprimir() {
System.out.println("Isso é uma CONTA CORRENTE!");
}
}
public class Teste {
public static void main(String[] args) {
Conta c = new Conta(1, 11, 100);
c.imprimir();
Conta cc = new ContaCorrente(2, 22, 200, "Joao");
cc.imprimir();
}
}
Aqui vemos claramente, que independente da variável de referência ser do tipo Conta (Polimorfismo permite isso), em tempo de execução a instância criada é um objeto do tipo ContaCorrente, e usará os comportamentos que a classe ContaCorrente especificar. Logo, não utiliza o método imprimir da superclasse Conta, mas sim o seu próprio.
Não confundam achando que o tipo da variável de referência faz uma instância de um objeto ser tratado como outro blz.
Qualquer dúvida fiquem a vontade.
Abraços e bons estudos.