Como criar objetos iguais com endereços diferentes?

Olá, no java se eu tenho um objeto por exemplo
Carro carro1 = new Carro();
E eu defino defino valores para os atributos da classe carro.
Nesse caso, se eu fizer:
Carro carro2 = carro1;
Caso eu venha a alterar os atributos do objeto carro2 vou acabar alterando o do carro1 também, correto? Pois estou passando o endereço do carro1 para carro2. Mas e se eu quiser criar uma cópia de carro1 em carro 2, mas não quero que as alterações nos atributos que farei no carro2 alterem o carro1, como posso fazer isso?

Sim.

Você precisa criar um novo objeto e copiar atributo por atributo. Um jeito comum de fazer isso é criar um método na classe para retornar a nova instância. Algo como:

class ClasseA{
  int x;
  int y;

  public ClasseA clone(){
    ClasseA clone = new ClasseA();
    clone.x = this.x;
    clone.y = this.y;
    return clone;
  }
}

Usando:

ClasseA objeto1 = new ClasseA();
ClasseA objeto2 = objeto1.clone();

Mais informações em: https://www.devmedia.com.br/clonagem-de-objetos-em-java-usando-a-interface-cloneable/28524

Abraço.

Pode fazer de forma manual por meio de getters e setters ou construtores ou ainda usar algumas libs que já fazem isso como por exemplo a BeanUtils do Spring, Commons Lang da Apache, ModelMapper por aí vai…