Como o Java detecta com qual das instâncias você está trabalhando?

Tenho pouco conhecimento em Java, e me deparei com o seguinte código:

No caso, na linha 14, no método transferir, como o Java fez para detectar que o primeiro parâmetro (no caso, o contaDestino) parte da instância atual (isso é, ele detecta que aquela referência é a da contaDestino, e não a da “conta atual”)?

Olá. Bom, vamos pra teoria, Uma classe contém campos e métodos, uma classe é um Objeto. Campos e funções são objetos. Quando criamos uma instancia de classe na verdade estamos pegando o modelo original da classe e duplicando ele no novo objeto.

Por isso você pode criar várias “Contas” e nenhuma pode alterar o campo da outra diretamente. Exceto se o campo for do tipo publico E estático e quando você passa a instancia de classe como parametro para um método que pode alterar os campos publicos ou via metodos “setter” localmente. Vale lembrar que um campo estático pode ser acessado e alterado por todas as instancias de classe da classe base.

O primeiro argumento na verdade não é a instancia atual e sim uma outra instancia da classe base “Conta”.
Se “contaDestino” não for nula o método pode acessar os MÉTODOS E CAMPOS PÚBLICOS podendo assim usar os “getters” e “setters” definidas na classe base.

Por exemplo é criada uma “Conta” de ID = 1 com 300 reais de saldo e outra “Conta” de ID = 2 com 100 reais.
Ao usar:

contaID1.transferir(contaID2, 100);

O método é chamado não na classe base e sim na cópia (instancia). Podemos observar que para alterar o saldo da conta alvo é utilizado: “contaDestino.saldo += valor”. Se você chamasse “saldo += valor” na verdade você estaria adicionando saldo na “contaID1” e não na “contaID2”. Tanto que é utilizado “saldo -= valor”, já que ao fazer uma transferencia de “contaID1” para “contaID2” o “valor” precisa ser removida do saldo da Conta do transferidor e adicionado na conta do transferinte.

Ah, “contaDestino” é só o nome do parametro e nao um nome de Objeto.

E sobre a sua pergunta no fim, Quando você passa qualquer instancia de Conta no método transferir e no corpo do método você especificar que quer alterar o valor daquele parametro o Java vai alterar o valor na instancia referenciada e não na classe da qual o método foi invocado.