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

Dúvida no Ex. 3 da Aula 5 - Collections framework

Bom dia pessoal, Estou com um problema na compilação do meu código: está dando a seguinte mensagem:

br.com.empresa.banco.conta.ContaPoupanca@2a139a55
br.com.empresa.banco.conta.ContaPoupanca@15db9742
br.com.empresa.banco.conta.ContaPoupanca@6d06d69c

segue as classes para que vocês possam analisar e me ajudar, já quebrei a cabeça e ainda não consegui encontrar a solução.

Classe Conta:

package br.com.empresa.banco.conta;

public abstract class Conta {
    protected double saldo;

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

    protected int numero;

    public int getNumero() {
        return this.numero;
    }

    public void deposita(double valor) {
        if (valor < 0) {
            throw new ValorInvalidoException(valor);
        } else {
            this.saldo += valor;
        }
    }

    public void saca(double valor) {
        this.saldo -= valor;
    }

    public abstract void atualiza(double taxaSelic);
}

Classe ContaPoupanca:

package br.com.empresa.banco.conta;

public class ContaPoupanca extends Conta implements Comparable<ContaPoupanca> {
    private String nome;

    public ContaPoupanca(double saldo, String nome) {
        this.saldo = saldo;
        this.setNome(nome);
    }

    public void atualiza(double taxa) {
        this.saldo += this.saldo * taxa * 3;
    }

    public void deposita(double valor) {
        this.saldo += valor - 0.10;
    }

    @Override
    public int compareTo(ContaPoupanca outra) {
        return this.getNumero() - outra.getNumero();
    }

    public String getNome() {
        return nome;
    }

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

Classe TestaOrdenacao:

package br.com.empresa.banco;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import br.com.empresa.banco.conta.ContaPoupanca;

public class TestaOrdenacao {
    public static void main(String[] args) {
        List<ContaPoupanca> contas = new ArrayList<ContaPoupanca>();

        ContaPoupanca cp1 = new ContaPoupanca(1500.0, "caio");
        cp1.deposita(1500.0);
        contas.add(cp1);

        ContaPoupanca cp2 = new ContaPoupanca(467, "Adriano");
        cp2.deposita(2500.0);
        contas.add(cp2);

        ContaPoupanca cp3 = new ContaPoupanca(230, "Victor");
        cp3.deposita(1070.0);
        contas.add(cp3);

        Collections.sort(contas);

        for (ContaPoupanca conta : contas){
            System.out.println(conta);
        }
    }
}

Espero que consigam me ajudar... Um abraço!

7 respostas

Olá Anderson! Isso está ocorrendo em seu código pois você não sobrescreveu em sua classe o método toString(). No método System.out.println() deve ser passado como argumento uma String, então, ao passarmos um Objeto como argumento é chamado automaticamente o método toString() da classe Object que retorna uma String que é impressa. Porém, na classe Object a String que é retornada pelo método toString() é o endereço desse Objeto na memória, por isso a saída em seu console foi:

br.com.empresa.banco.conta.ContaPoupanca@2a139a55
br.com.empresa.banco.conta.ContaPoupanca@15db9742
br.com.empresa.banco.conta.ContaPoupanca@6d06d69c

Esse é o endereço das suas três contas na memória. Como toda Classe em Java herda de Object é possível sobrescrever o método toString() em sua classe, alterando então a String que você deseja ser retornada para imprimir.

No meu caso, eu coloquei da seguinte forma:

@Override
    public String toString() {
        return "O Saldo desta conta é: " + this.getSaldo();
    }

Assim quando eu chamo o System.out.println() será impresso uma String com o saldo da conta.

Espero ter ajudado! Bons Estudos!

Bom dia Anderson, blz?

Na sua classe CP tem o método compareTo que realiza uma operação envolvendo a variável numero que foi herdada da classe Conta, porém não vi no código essa variável recebendo valores quando os 3 objetos do tipo CP foram instanciados, ou uma atribuição automática a variável numero na classe CP.

Com isso creio que o método compareTo fica sem o que comparar já que a variável numero não tem valor.

Se quiser compara pelo saldo dai tem q mudar o compareTo também.

Também penso que seria melhor mudar o System.out.println(conta) para System.out.println(conta.nome), fica mais legível.

Att,

onde eu sobrescrevo o método toString? E... Qual valor eu coloco na váriavel número... ficou meio confuso rsrs...

Obrigado pela ajuda!

Coloca na sua classe CP igual ao que o Romário fez. :)

solução!

O método toString() creio que seja melhor você sobrescrever na classe Conta pois todas suas outras classes herdam dessa. O que o Ramon disse é que quando você criou os objetos:

       ContaPoupanca cp1 = new ContaPoupanca(1500.0, "caio");
        cp1.deposita(1500.0);
        contas.add(cp1);

        ContaPoupanca cp2 = new ContaPoupanca(467, "Adriano");
        cp2.deposita(2500.0);
        contas.add(cp2);

        ContaPoupanca cp3 = new ContaPoupanca(230, "Victor");
        cp3.deposita(1070.0);
        contas.add(cp3);

Você não atribuiu nenhum número ao atributo numero de suas Contas:

Ou seja, todos por padrão estão recebendo o mesmo valor e devido a isso o método compareTo(), que serve para comparar as contas entre si para gerar uma ordenação, fica sem sentido. Para esse método funcionar você teria que atribuir um valor para as variáveis de instancia numero de seus objetos.

Também é possível consertar a saída em seu console através da sugestão do Ramon em substituir System.out.println(conta) por System.out.println(conta.getNome()). No entanto, eu sugeri sobrescrever o método toString() porque é como está sendo utilizado no exercício e pois na aula anterior era pra você ter implementado esse método em sua classe e percebi que você não implementou.

Vlwww!

package br.com.empresa.banco;

import java.util.ArrayList; import java.util.Collections;

import br.com.empresa.banco.conta.ContaPoupanca;

public class TestaOrdenacao { public static void main(String[] args) { ContaPoupanca cp1 = new ContaPoupanca(5,1500); ContaPoupanca cp2 = new ContaPoupanca(3,400); ContaPoupanca cp3 = new ContaPoupanca(2,900);

ArrayList contaP = new ArrayList<>(); contaP.add(cp1); contaP.add(cp2); contaP.add(cp3);

System.out.println("==Nao Ordenado=="); for (ContaPoupanca contaPoupanca : contaP) { System.out.println("======================="); System.out.println(contaPoupanca.getNumero()); System.out.println(contaPoupanca.getSaldo()); } Collections.sort(contaP); System.out.println("==Ordenado=="); for (ContaPoupanca contaPoupanca : contaP) { System.out.println("======================="); System.out.println(contaPoupanca.getNumero()); System.out.println(contaPoupanca.getSaldo()); }

} }