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

Dúvida em orientação a objetos

No caso eu posso fazer isso e dá certo:

/**
 * @Date 25/07/2017 - 20:55hs
 * @author Renato
 *
 */

public class TesteGeralContas {

    public static void main(String[] args) {

        ContaCorrente cc = new ContaCorrente(100);

        Conta conta = cc;

        conta.deposita(900);

        cc.deposita(900);

        conta.atualiza(0.01);

        cc.atualiza(0.01);

        System.out.println(conta.getSaldo());

        System.out.println(cc.getSaldo());

    }

}

Mas quando faço o que está abaixo no exemplo dá erro é possível fazer ou não gostaria de obter uma explicação do porque não pode:

/**
 * @Date 25/07/2017 - 20:55hs
 * @author Renato
 *
 */

public class TesteGeralContas {

    public static void main(String[] args) {

        ContaCorrente cc = new ContaCorrente(100);

        ContaPoupanca cp = new ContaPoupanca(100);

        Conta conta = cc;

        Conta c = cp;


        conta.deposita(900);

        cc.deposita(900);

        cp.deposita(900);

        conta.atualiza(0.01);

        cc.atualiza(0.01);

        cp.atualiza(0.01);

        System.out.println(conta.getSaldo());

        System.out.println(cc.getSaldo());

        System.out.println(cp.getSaldo());

    }

}
6 respostas

Fala Renato, tudo bem ?

Qual erro está acusando? O erro é de compilação, impedindo rodar o programa ? Ou você está recebendo um erro durante a execução ? Se for em execução, poste aqui os possíveis logs de erro que aparecem no console ..

Abraço!

Já descobri o erro foi do eclipse já reinstalei a IDE, quero saber a real utilidade de fazer esses entrelaçamentos de variáveis de referencias... Os valores também mudaram quando ponho desta forma:

ContaCorrente cc = new ContaCorrente(100);

ContaPoupanca cp = new ContaPoupanca(100);

Conta conta = cc;

Conta c = cp;

Os valores sobem de 1010 para 1976,76 não entendi nada kkkkkkkk

Sobre os valores subirem para 1976.76 deve ser algo relacionado a sua implementação. O que o método atualiza faz?

A classe Conta está assim:



public class Conta {

    protected double saldo;

    public Conta(double saldoInicial) {

        this.saldo = saldoInicial;

    }

    public void atualiza(double taxa) {

        this.saldo += this.saldo * taxa;


    }

    public double getSaldo() {
        return this.saldo;
    }

    public void deposita(double valorDepositado) {

        this.saldo += valorDepositado;

    }

    public void saca(double valorSacado) {

        if (valorSacado <= this.saldo) {

            this.saldo -= valorSacado;

        } else {

            System.out.println("Saldo Insuficiente para saque.");

        }

    }

    void mostra() {

        System.out.println("O saldo é de: " + getSaldo());

    }

}

Na classe ContaCorrente está assim:


public class ContaCorrente extends Conta {

    public ContaCorrente(double saldoInicial) {

        super(saldoInicial);

        // TODO Auto-generated constructor stub

    }

    @Override

    public void atualiza(double taxa) {

        this.saldo += this.saldo  * taxa  *  2;

    }

}

Na classe ContaPoupanca está assim:


public class ContaPoupanca extends Conta {

    public ContaPoupanca(double saldoInicial) {

        super(saldoInicial);

        // TODO Auto-generated constructor stub
    }

    @Override

    public void atualiza(double taxa) {

        this.saldo += this.saldo  *  taxa  *  3;

    }

    @Override

    public void deposita(double valorDepositado) {

        this.saldo += valorDepositado - 0.10;

    }

}

E classe main está assim:


public class TesteGeralContas {

    public static void main(String[] args) {

        ContaCorrente cc = new ContaCorrente(100);

        ContaPoupanca cp = new ContaPoupanca(100);

        Conta conta = cc;

        Conta c = cp;

        conta.deposita(900);

        cc.deposita(900);

        cp.deposita(900);

        conta.atualiza(0.01);

        cc.atualiza(0.01);

        cp.atualiza(0.01);

        System.out.println(conta.getSaldo());

        System.out.println(cc.getSaldo());

        System.out.println(cp.getSaldo());

    }

}
solução!

Entao vamos la

Vamos focar apenas no classe ContaCorrente, depois expandimos a discussao para classe da conta poupança

Inicialmente voce cria uma instancia da ContaCorrente chamanda de cc

ContaCorrente cc = new ContaCorrente(100);

Nesse momento cc tem o saldo de 100 reais (iniciais)

Logo depois voce copia essa instancia para outra variavel chamada de conta

Conta conta = cc;

Depois voce deposita 900 reais na conta, porém ela apenas uma referencia para instancia cc entao na verdade voce adicionou 900 em cc

conta.deposita(900);

Aqui entao cc e conta tem o saldo de 1000 reais. Logo depois temos voce adiciona mais 900 reais nessa mesma intancia

cc.deposita(900);

Nesse momento tempos 1900 reias na instancia cc e conseguetemente na copia da instancia conta

Logo depois temos a chamada

conta.atualiza(0.01);

Entao pegamos o saldo da conta (1900) e multiplicamos por 0.02 (0.01 * 2) e somamos na mesma variavel, totalizando 1938.

Logo depois adicionamos novamento um juros na mesma instancia

cc.atualiza(0.01);

Obtendo entao 1938 e multiplicamos pelo mesmo valor, totalzando 1976.76, que foi o valor que voce recebeu na saida.

Logo depois voce imprime na saida,

System.out.println(conta.getSaldo());

System.out.println(cc.getSaldo());

Obtendo na saida duas vezes o valor 1976.76.

Isso que o que esta acontecendo na sua chamada, porém acredito que o que estavas querendo era uma nova instancia de ContaCorrente para variavel conta, entao invez de copiar a instancia deverias ter dado um novo new

 Conta conta = new ContaCorrente(100);

Acho que ficou mais claro agora, se continuar com duvida por favor, pergunte o que desejar

Espero ter ajudado

Henrique muito obrigado cara, foi top sua explicação e acabei tirando uma dúvida sobre a orientação a objetos valeu mesmo cara!