Olá, Marcus.
Tudo bem?
Você está correto. No exemplo que você mencionou, realmente há apenas um objeto, e tanto produto1 quanto produto2 são referências ao mesmo objeto na memória.
Vamos revisar o código para esclarecer:
public class Produto {
private String nome;
private double preco;
public Produto(String nome, double preco) {
this.nome = nome;
this.preco = preco;
}
public String getNome() {
return nome;
}
public double getPreco() {
return preco;
}
public void setPreco(double preco) {
this.preco = preco;
}
}
public class Teste {
public static void main(String[] args) {
Produto p1 = new Produto("Caneta", 1.50);
Produto p2 = p1; // p2 agora referencia o mesmo objeto que p1
p2.setPreco(2.00); // altera o preço do objeto referenciado por p1 e p2
System.out.println(p1.getPreco()); // imprime 2.00
}
}
No código acima, Produto p1 = new Produto("Caneta", 1.50); cria um novo objeto Produto e p1 referencia esse objeto. Quando você faz Produto p2 = p1;, p2 passa a referenciar o mesmo objeto que p1. Portanto, qualquer alteração feita através de p2 também será refletida em p1, pois ambos referenciam o mesmo objeto.
Quando o método setPreco(2.00) é chamado em p2, ele altera o preço do objeto referenciado por p1 e p2. Assim, ao chamar p1.getPreco(), o valor retornado será 2.00.
Espero ter ajudado e bons estudos!