Bom dia Caio.
Acredito que o seu código esteja mais ou menos assim:
public class Conta {
private int agencia;
private int numero;
private Cliente titular;
protected double Saldo;
public int getNumero() {
return this.numero;
}
public void setNumero(int numero) {
this.numero = numero;
}
public int getAgencia() {
this.agencia;
}
public void setAgencia(int agencia){
this.agencia = agencia;
}
public void setTitular(Cliente titular) {
this.titular = titular;
}
public Cliente getTitular() {
return titular;
}
}
public class Cliente {
private String nome;
private String cpf;
private String profissao;
public String getNome() {
return nome;
}
public String getCpf() {
return cpf;
}
public String getProfissao() {
return profissao;
}
public void setProfissao(String profissao) {
this.profissao = profissao
}
}
Quando você imprime essa linha
System.out.println(titularDaConta.getTitular())
é chamado o método toString padrão da classe Object, onde é impresso o identificador do objeto Cliente na VM(um hash code de identidade do objeto), e não o seu endereço na memória.
toString padrão:
getClass().getName() + '@' + Integer.toHexString(hashCode())
Por isso a saída deve ser algo como:
br.com.bytebank.banco.modelo.Cliente@7852e922
Você pode sobrescrever esse método toString padrão, lá na classe Cliente. Exemplo inserido na classe Cliente:
public String toString() {
return "Cliente: "+this.nome+ ", CPF: "+ this.cpf;
}
Em vez de imprimir o identificador do objeto a partir do toString padrão, é impresso o nome do cliente e o seu CPF.
Cliente: Caio, CPF: 123456
Código no main:
Cliente caio = new Cliente();
caio.setNome("Caio");
caio.setCpf("123456");
Conta contadoCaio = new Conta();
contadoCaio.setNumero(123);
contadoCaio.setAgencia(1234)
contadoCaio.setTitular(caio); //Atribuindo o cliente caio para a Conta conta.
System.out.println(contadoCaio.getTitular());
Também pode chamar o getTitular() da classe Conta e imprimir o nome ou CPF diretamente sem utilizar a implementação de um novo toString:
System.out.println("Nome: "+contadoCaio.getTitular().getNome()+", CPF: "+contadoCaio.getTitular().getCpf());
Aqui quando chama o getTitular() é apontado para o objeto Cliente que foi setado para a contadoCaio, por isso podemos imprimir o seu nome e CPF.
Sua outra dúvida é referente a um erro de compilação para o código abaixo:
titularDaConta.setTitular("caio cesar");
// caio.setNome("caio cesar");
// conta.setTitular("caio cesar");
Na primeira e terceira linha você está colocando uma String para o titular, o correto seria passar a referência de um objeto Cliente criado, pois lendo o exercício sua classe Conta deve receber uma referência a um objeto da classe Cliente.
public class Conta {
private int agencia;
private int numero;
private Cliente titular; // <<<<<
Então o correto seria:
Cliente caio = new Cliente();
caio.setNome("Caio");
caio.setCpf("123456");
Conta conta = new Conta();
conta.setNumero(123);
conta.setAgencia(1234)
conta.setTitular(caio); // <<<<< Setando o cliente para a Conta conta usando a referência do objeto Cliente criado. O nome entre aspas você coloca no nome do Cliente, que é do tipo String.