6
respostas

Dúvida no Exercício 8

Olá pessoa, eu não entendi muito o código passado para esse exercício, pois quando passo o parâmetro na classe de testa do Eclipse reclama que não tem um construtor definido na classe conta corrente Crio o construtor (padrão) e independente dos valores in insiro, o resultado não muda. No caso do == sempre dá que são objetos diferentes e no equals objetos equivalentes.

Meu código na classe Conta:

private int numero;

    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

    @Override
    public boolean equals(Object obj) {
        Conta outraConta = (Conta) obj;

        return this.numero == outraConta.numero;
    }

Meu código na classe TestaComparacaoContas:

ContaCorrente cc1 = new ContaCorrente(6);
        ContaCorrente cc2 = new ContaCorrente(5);

        if (cc1 == cc2) {
            System.out.println("Mesmo objeto");
        } else {
            System.out.println("Objetos Diferentes");
        }

        if (cc1.equals(cc2)) {
            System.out.println("Objetos Equivalentes");
        } else {
            System.out.println("Objetos não equivalentes");
        }
6 respostas

A Diferença é a questão que o operador == busca pela memoria do java, já o operado reescrito seu equals verifica pelo numero da conta ( no caso sua variavel numero )

Isso eu entendi, o problema é que no código que eu fiz o resultado dá o mesmo. No caso do exemplo que coloquei os valores das variáveis de cc1 e cc2 são diferentes e assim mesmo na execução do código aparece que são equivalentes. O que estou tentando fazer, na verdade, é identificar o erro no meu código.

Valeu.

Olá Rodrigo,

Na sua classe de teste você está fazendo:

ContaCorrente cc1 = new ContaCorrente(6);

Repare que a ContaCorrente está recebendo um número como parâmetro no construtor. Por esse motivo, o compilador irá exigir que você implemente um construtor que receba este parâmetro.

Pelo que você disse você já implementou esse construtor mas ele provavelmente deve estar vazio:

class ContaCorrente extends Conta {
    public ContaCorrente(int numero) {

    }
}

Isso significa que recebemos esse número no construtor mas o que estamos fazendo com ele? Como o construtor está vazio então apenas recebemos o valor e depois ele é jogado fora. Deste modo, qual o valor do número da conta depois de instanciada? Ele continua sendo zero, independente do valor que passamos no construtor!

Agora, o que vai acontecer quando você invocar o equals comparando as duas contas? Como comparamos apenas o valor do número das duas contas, ambas possuem número zero e portanto serão consideradas iguais!

Para resolver seu problema você precisa corrigir o construtor da sua classe ContaCorrente. Você vai precisar usar o número que você está recebendo como parâmetro para definir o número da conta.

Tente corrigir e depois nos conte se deu certo!

Aproveitando o momento de dúvidas sobre comparação, no caso de compararmos se algum conteúdo é Null? Ok..foi estudado que devemos comparar conteúdo com o método equals, tudo bem! Aí vem a pergunta: para usar o equals eu sempre terei que sobrescrever o método equals? Exceto String, pois vimos que String a comparação é feita caracter a caracter.

Olá Julio,

Sim, sempre que queremos utilizar o equals em uma classe de nossa autoria precisamos sobrescrever esse método para especificar o critério de comparação. Caso contrário, o equals tera o mesmo comportamento de compararmos os objetos utilizando o ==, isto é, somente as referências serão comparadas.

Para verificarmos se um objeto é nulo, fazemos uma comparação simples utilizando ==:

Conta conta = null;
if (conta == null) {
    System.out.println("Conta nula!");
}

Valeu Jeferson, era essa a resposta que eu queria. Entendido!