Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida no Ex. 7 da Aula 1 - Herança, reescrita e polimorfismo

Qual seria a vantagem de declararmos uma variável de um tipo menos específico do que o objeto realmente é?

2 respostas
solução!

Oi Alexandre,

Você tem a vantagem de poder usar o polimorfismo. Um método que recebe um tipo pai consegue receber qualquer um dos tipos filhos. Exemplo:

Imagine que você tem uma classe Conta e duas classes filhas ContaCorrente e ContaPoupanca. Algo como:

public class Conta {
    private int numero;
    private int agencia;
    private double saldo;

    public Conta(int numero, int agencia, double saldoInicial) {
        this.numero = numero;
        this.agencia = agencia;
        this.saldo = saldoInicial;
    }

    public String extrato() {
        return "Conta possui saldo de: " + this.saldo;
    }

    // outros métodos
}

public class ContaCorrente extends Conta {
    private double limite;

    public ContaCorrente(int numero, int agencia, double saldoInicial, double limite) {
        super(numero, agencia, saldoInicial);
        this.limite = limite;
    }

    // métodos

    public String extrato() {
        return "Conta Corrente -- Saldo: [" + this.getSaldo() + "]  Limite: [" + this.limite + "]";
    }
}

public class ContaPoupanca extends Conta {
    private double taxa;

    public ContaPoupanca(int numero, int agencia, double saldoInicial, double taxa) {
        super(numero, agencia, saldoInicial);
        this.taxa = taxa;
    }

    // métodos
}

Se tivermos uma classe que imprime os extratos das contas, podemos dizer que o método recebe um parâmetro do tipo da classe mãe que o mesmo funcionará tanto para a ContaCorrente quanto para ContaPoupanca.

public class ConsolidaExtratos {
    public void imprimeExtrato(Conta conta) {
         System.out.println("Imprimindo extrato da conta: " + conta);
        System.out.println(conta.extrato());
    }
}

public class Teste {
    public static void main(String [] args) {
        ConsolidaExtratos ce = new ConsolidaExtratos();
        ContaCorrente cc = new ContaCorrente(1, 100, 1000, 500);
        ContaPoupanca cp = new ContaPoupanca(2, 100, 1000, 0.05);
        ce.imprimeExtrato(cc);
        ce.imprimeExtrato(cp);
    }
}

Por conta de usarmos o tipo menos específico, podemos passar os dois tipos para o método imprimeExtrato.

Ficou um pouco mais claro?

Abraço!

Entendi. Obrigado!