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

Dúvida no Ex. 8 da Aula 3 - Java.lang

Tenho os seguinte código:

Classe Conta:

public abstract class Conta {
    private int ID;
    private String nome;
    private double saldo;

    abstract double getSaldoAposDeposito();

    public int getID() {
        return ID;
    }

    public void setID(int iD) {
        ID = iD;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public double getSaldo() {
        return saldo;
    }

    public double setSaldo(double saldo) {
        return this.saldo = saldo;
    }

    //toString
    public String toString(){
        return "Esse objeto e uma conta com saldo R$" +this.saldo;
    }

    public boolean equals(Object obj){
        Conta outraConta = (Conta) obj;
        return this.ID == outraConta.ID;
    }
}

Classe ContaCorrente

public class ContaCorrente extends Conta{


    public double saldoAposDeposito;
    public double deposita;

    public double valorASerDepositado(double valorDeposito){
        return this.deposita = valorDeposito;
}

    public double getSaldoAposDeposito() {
    this.saldoAposDeposito =  deposita + getSaldo() ;
        return saldoAposDeposito;
    }


}

Classe TestaConta

public class TestaConta{

    public static void main(String[] args) {
        Conta cc1 = new ContaCorrente(); //possui os atrributos saldo, ID e nome
        Conta cc2 = new ContaCorrente();

        ContaCorrente cc1Operacoes = new ContaCorrente();
        ContaCorrente cc2Operacoes = new ContaCorrente();


        /*
         * ID, nome e salso são atributos de Conta que é abstract
         * deposita atributos de Conta Corrente
         * O método "valorASerDepositado(double valorDeposito)" é obrigatório na classe filha ContaCorrente que extends de Conta, que é abstract
         */
        cc1.setID(1); 
        cc1.setNome("Paulo");
        cc1.setSaldo(100);
        cc1Operacoes.valorASerDepositado(150);
        System.out.println("ID: " +cc1.getID()+ " O valor do saldo de "+cc1.getNome()+" na conta corrente é "+cc1.getSaldo()+" apos o deposito de  " +cc1Operacoes.deposita+ " será de "+cc1Operacoes.getSaldoAposDeposito());

        //outros dados apontados.    
        cc2.setID(2); 
        cc2.setNome("Joao");
        cc2.setSaldo(10);
        cc2Operacoes.valorASerDepositado(1000); 
        System.out.println("ID: " +cc2.getID()+ " O valor do saldo de "+cc2.getNome()+" na conta corrente é "+cc2.getSaldo()+" apos o deposito de  " +cc2Operacoes.deposita+ " será de "+cc2Operacoes.getSaldoAposDeposito());

        //
        System.out.println(cc1);

        //reescrevendo o metodo toString
        System.out.println(cc1);


    }


}

O resultado para TestaConta foi:

ID: 1 O valor do saldo de Paulo na conta corrente é 100.0 apos o deposito de  150.0 será de 150.0
ID: 2 O valor do saldo de Joao na conta corrente é 10.0 apos o deposito de  1000.0 será de 1000.0
Esse objeto e uma conta com saldo R$100.0
Esse objeto e uma conta com saldo R$100.0

Dúvida: Porque não estou conseguindo imprimir o saldo total após o deposito, ou seja, onde se lê "apos o deposito de 150.0 será de 150.0" deveria ser "apos o deposito de 150.0 será de 250.0"

5 respostas

Ola, Ronaldo José Guastalli !

Primeiro vc instancia 2 contas e para essas contas esta sendo atribuído valores:

Conta cc1 = new ContaCorrente();
Conta cc2 = new ContaCorrente();

Depois vc cria mais 2 contas e vc passa o valorASerDepositado(1000);

ContaCorrente cc1Operacoes = new ContaCorrente();
ContaCorrente cc2Operacoes = new ContaCorrente();

Ao executar a linha abaixo:

System.out.println("ID: " +cc1.getID()+ " O valor do saldo de "+cc1.getNome()+" na conta corrente é "+cc1.getSaldo()+" apos o deposito de  " +cc1Operacoes.deposita+ " será de "+cc1Operacoes.getSaldoAposDeposito());

Qndo o metodo getSaldoAposDeposito() é chamado, esta sendo chamado da instancia cc1Operacoes e dentro dele ele vai somar: valor deposita com o getSaldo(). Esse getSaldo() não faz referencia a instancia que contem o valor no casso cc1.

Entendeu que essas instancias, uma não sabe da outra ?

Conta cc1 = new ContaCorrente();
ContaCorrente cc1Operacoes = new ContaCorrente();

Existe varias formas de resolver esse problema, tudo depende do que vc precisa para a implementação do seu negócio.

Uma solução simples para esse problema, seria passar o metodo para realizar o deposito para dentro da classe Conta e ao realizar o deposito vc já fazer a soma com o saldo. Dessa forma vc nao teria mais esse metodo getSaldoAposDeposito é só usar o getSaldo().

Endenteu?

Abraço!

Mas como a classe ContaCorrente é filha da classe Conta e sendo cc1Operacoes do tipo ContaCorrente, não herdaria, através do getSaldo() ?

solução!

Sim, ela herda certinho. Essa parte esta perfeito.

Mas no seu código, vc instancia:

cc1Operacoes = new ContaCorrente();

e

cc1 = new ContaCorrente();

Certo ?

Perceba que cc1 é uma instancia e que é outra cc1Operacoes.

A Herança esta certa, mas como se trata de instancias diferente, cc1 tem o valor inicial do saldo que vc setou, porém, cc1Operacoes só tem o valor para depositar E como cc1 e cc1Operacoes sao instancias diferentes, UMA não SABE da OUTRA.

Entendeu ?

Ola, Ronaldo José Guastalli !

Duvida solucionada ?

Caso positivo, poderia fechar esse fórum como resolvido por gentileza ?

Obrigado!

Entendi, obrigado!!!