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

Endereço de memória dos objetos

public class Conta {
    private double saldo; 
    private int agencia;
    private int numero;
    private Cliente titular = new Cliente();

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

    public boolean saca(double valor){
        if (this.saldo >= valor ){
            this.saldo = this.saldo - valor;
            return true;
        }else{
            System.out.println("Dinheiro insuficiente");
            return false;
        }
    }

    public boolean transfere(double valor, Conta destino){
        if (this.saldo >= valor){
            this.saldo = this.saldo - valor;
            destino.deposita(valor);
            return true;
        }else{
            System.out.println("Sem dinheiro o suficiente para transferir");
            return false; 
        }
    }

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

    public void setAgencia(int novaAgencia){
        if ( novaAgencia <= 0 ){
            System.out.println("Número não aceito");
        }else{
            this.agencia = novaAgencia;  
        }
    }

    public int getAgencia(){
        return this.agencia;
    }

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

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

    public Cliente getTitular(){
        return this.titular;
    }

    public void setTitular(Cliente titular){
        this.titular = titular;
    }

}
public class Cliente {
    private String nome;
    private String cpf;
    private String profissao;

    public String getNome() {
        return nome;
    }
    public String getProfissao() {
        return profissao;
    }
    public void setProfissao(String profissao) {
        this.profissao = profissao;
    }
    public String getCpf() {
        return cpf;
    }
    public void setCpf(String cpf) {
        this.cpf = cpf;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }


}
public class TestaGetSet {
    public static void main(String[] args) {
        Conta contaDaLuana = new Conta();
        contaDaLuana.setAgencia(2);
        System.out.println(contaDaLuana.getAgencia());

        contaDaLuana.setNumero(111);
        System.out.println(contaDaLuana.getNumero());

        contaDaLuana.getTitular().setNome("luana");
        System.out.println("Nome: " + contaDaLuana.getTitular().getNome());

        contaDaLuana.getTitular().setCpf("999.999.999-99");
        System.out.println("CPF: " + contaDaLuana.getTitular().getCpf());

        contaDaLuana.getTitular().setProfissao("Tech");
        System.out.println("Profissão: " + contaDaLuana.getTitular().getProfissao());

        System.out.println("Endereço de memória referencia: " + contaDaLuana.getTitular()); // retorna Cliente@15db9742
        System.out.println("Endereço de memória da conta: " + contaDaLuana); // retorna Conta@6d06d69c
    }
}

A minha dúvida é a seguinte: Ao imprimir no terminal contaDaLuana.getTitular() me retorna Cliente@15db9742 e depois contaDaLuana me retorna Conta@6d06d69c até aí tudo ok! Mas ao inverter a ordem, segue código abaixo:

    System.out.println("Endereço de memória da conta: " + contaDaLuana); // retorna Conta@15db9742
    Sstem.out.println("Endereço de memória referencia: " + contaDaLuana.getTitular()); // retorna Cliente@6d06d69c

contaDaLuana passou a ter o endereço de memória da referencia ao objeto Titular e vice e versa, ou seja, contaDaLuana não deveria continuar com o valor de Conta@6d06d69c e contaDaLuana.getTitular() com o valor Cliente@15db9742?

3 respostas

Pensa que "15db9742" e "6d06d69c" são posições na memória do seu computador, "caixinhas" que armazenam informações, o que acontece é que ao inverter no seu último exemplo a JVM alocou uma posição diferente na memória para cada referência

Quando eu faço essa instanciação :

Conta contaDaLuana = new Conta();

atribuo uma referência para a variável contaDaLuana, não entendi como ao inverter a ordem do ultimo exemplo a JVM alocou uma posição diferente na memória, sendo que a referencia foi dada na primeira linha do código quando ocorreu a instanciação. Sabe me explicar?

solução!

Oi Gedielson

Como você está usando o método equals/hashCode default da classe Object está sendo gerado o mesmo hash para a Conta/Cliente, a depender de quem é chamado primeiro.

Na sua classe Conta sobreescreva os métodos equals e hashCode conforme exemplo abaixo:

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Conta conta = (Conta) o;
        return Double.compare(conta.saldo, saldo) == 0 && agencia == conta.agencia && numero == conta.numero && Objects.equals(titular, conta.titular);
    }

    @Override
    public int hashCode() {
        return Objects.hash(saldo, agencia, numero, titular);
    }

Feito isso você vai perceber que "Conta" vai passar a receber sempre o mesmo hash, ex: Conta@15db9742, independente da ordem em que for usado no System.out.println