airmigjr:
Na verdade eu até estou estudando polimorfismo. Mas porque não fazer simplesmente (como disse no seu exemplo), se B herda de A,
ClasseB b = new ClasseB();
porque se referenciar a Classe mãe ???
Pelo que você mesmo disse Polimorfismo! A chave do polimorfismo é que a classe que herda pode implementar um novo comportamento ou modificar o comportamento da classe herdada.
Por que ClasseA A = new ClasseB() e não ClasseB b = new ClasseB()?
Bom vamos imaginar uma classe chamada Impressora.
class Impressora {
private String titulo;
private String corpo;
private String rodape;
public void definirTitulo(String titulo){
this.titulo = titulo;
}
public void definirCorpo(String corpo){
this.corpo = corpo;
}
public void definirRodape(String rodape){
this.rodape = rodape;
}
public void imprimir(){
if (titulo != null)
System.out.println(titulo);
if (corpo != null)
System.out.println(corpo);
if (rodape != null)
System.out.println(rodape);
}
}
Ai você cria uma outra classe para um relatório por exemplo
class Relatorio {
private Impressora impressora;
public Relatorio(){
impressora = new Impressora ();
}
public void imprimirDados(String titulo, String corpo, String rodape){
impressora.definirTitulo(titulo);
impressora.definirCorpo(corpo);
impressora.definirRodape(rodape);
impressora.imprimir();
}
}
Só que você pode precisar criar uma classe para imprimir um comprovante então você faz:
class Comprovante {
private Impressora impressora;
public Comprovante(String titulo, String dados){
impressora = new Impressora ();
impressora.definirTitulo(titulo);
impressora.definirCorpo(dados);
}
public void emitir(String rodape){
impressora.imprimir();
}
}
Só que um dia você tem que alterar e fazer uma classe que imprima na tela e em papel, como você não é bobo reaproveita o código né
class Impressora {
protected String titulo;
protected String corpo;
protected String rodape;
...
}
class ImpressoraEmPapel implements Impressora {
@Override
public void imprimir(){
//Implementação para papel digamos que seja algo como:
ImpressoraDeVerdade impressora = new ImpressoradeVerdade
//O método imprimir campo é do tipo imprimirCampo(texto, posicaoX, posicaoY);
impressora.iniciar();
impressora.imprimirCampo(titulo, 0, 0);
impressora.imprimirCampo(corpo, 0, 1);
impressora.imprimirCampo(rodape, 0, 20);
impressora.terminar();
}
}
só que agora o bicho pega. Você vai ter que fazer um monte de IFs
class Comprovante {
private boolean imprimirEmPapel;
private Impressora impressoraNormal;
private ImpressoraEmPapel impressoraPapel;
public Comprovante(boolean imprimirEmPapel; String titulo, String dados){
this.imprimirEmPapel = imprimirEmPapel;
if (imprimirEmPapel)
impressoraPapel = new ImpressoraEmPapel();
else
impressoraNormal := new Impressora();
if (imprimirEmPapel){
impressoraPapel.definirTitulo(titulo);
impressoraPapel.definirCorpo(dados);
}
else{
impressoraNormal.definirTitulo(titulo);
impressoraNormal.definirCorpo(dados);
}
}
public void emitir(String rodape){
if (imprimirEmPapel)
impressoraPapel.imprimir();
else
impressoraNormal.imprimir();
}
}
Imagina agora vai ter que fazer a mesma coisa para a Classe Relatorio e todas as classes que usam né! Para isso que existe o polimorfismo, olha como fica bem mais simples;
class Comprovante {
private Impressora impressora;
public Comprovante(boolean imprimirEmPapel; String titulo, String dados){
if (imprimirEmPapel)
impressora = new ImpressoraEmPapel()
else
impressora = new Impressora ();
...
}
}
Não precisso mexer na classe inteira para fazer isso.
Esse é um exemplo beemm simples para você entender. O mais correto nesse caso é usar interfaces, enviar a impressora pelo construtor entre outros. Mas não se preocupe com isso se você ainda não estudou