Olá Thailan
Vou deixar uns comentários no código pra ver ajuda na compreensão.
public static void main(String[] args) {
Conta conta = new Conta(); // referência conta aponta pra um novo objeto do tipo Conta
Cliente paulo = new Cliente(); // referência paulo aponta pra um novo objeto do tipo Cliente
conta.setTitula(paulo); // chama o método setTitula do objeto passando o a referência paulo, assim o atributo titular de conta aponta pro mesmo objeto que a variável paulo
Cliente titularDaConta = conta.getTitula(); // conta.getTitula() pega o objeto apontado pelo atributo titula de conta. A referência titularDaConta aponta pra esse objeto, que é o mesmo apontado pela variável paulo
System.out.println(paulo);
System.out.println(titularDaConta);
System.out.println(conta.getTitula());
Conta x = new Conta(); // referência x aponta pra um novo objeto do tipo Conta (diferente da Conta que foi criada lá em cima)
x.setTitula(paulo); // chama o método setTitula do objeto passando o a referência paulo, assim o atributo titular de x aponta pro mesmo objeto que a variável paulo
Cliente titularConta = x.getTitula(); // x.getTitula() pega o objeto apontado pelo atributo titular de x. A referência titularConta aponta pra esse objeto, que é o mesmo apontado pela variável paulo
}
Ao final desse método, temos 2 Contas na memória, onde a variável conta
aponta pra uma delas e x
aponta pra outra.
Temos também a 1 objeto Cliente. Este é apontado pela variável paulo
, pelo atributo titular de conta
e, também, pelo atributo titular de x
.
De início é complicado mesmo entender esse jogo de setas e apontamentos. Mas tente entender o que acontece com cada referência e poste aí as dúvidas que surgirem.