Ref.: Problemas com Equivalência de Classes

Bom dia, estou tendo problemas utilizando copia de classe vejam, tenho uma classe:

package maxctrl.componentes;

public class ParametrosInternos {

    private String bancoDadosDestino = "";

    public void setBancoDadosDestino(String bancoDadosDestino) {
        this.bancoDadosDestino = bancoDadosDestino;
    }

    public String getBancoDadosDestino() {
        return bancoDadosDestino;
    }
}

Isso é um simples exemplo Ok … Agora imagine se eu instanciar duas vezes essa classe:

ParametrosInternos teste1 = new ParametrosInternos();
ParametrosInternos teste2 = new ParametrosInternos();

ok, assim eu tenho 2 objetos, o teste1 e o teste2, os seus valores devem ser separados, se eu setar um valor no teste1, só deve afetar o teste1 e não os 2 Correto …

Até ai funciona perfeitamente, mas se em algum momento eu quizer fazer uma copia, deixar o teste2 igual ao teste1 dessa forma:

teste2 = teste1;

ok, os objetos ficaram iguais, mas apartir desse ponto, tudo o que eu alterar em um objeto sera alterado nos dois, por exemplo se eu setar o teste2, tambem sera alterado o teste1;

Isso é normal ?, como eu posso fazer uma copia e, os objetos continuarem sendo separados ??

Olá lepopps,

Quando você faz uma cópia de objetos utilizando o sinal de atribuição “=” (teste2 = testes1) ele vai fazer uma cópia do endereço de teste1 para o teste2 então agora os dois objetos fazem referência ao mesmo endereço de memória, no caso o teste2 faz referência ao mesmo endereçamento de memória do teste1. Por isso que quando mudar em um vai estar mudado no outro.

Para fazer um clone de objeto é utilizado a interface Cloneable.

Principal.java

public class Principal {

	public static void main(String[] args) {
		ParametrosInternos teste1 = new ParametrosInternos();
		teste1.setBancoDadosDestino("valor teste1");
		
		ParametrosInternos teste2 = new ParametrosInternos();
		teste2.setBancoDadosDestino("valor teste2");
		
		
		System.out.println("Objeto teste1: " + teste1.getBancoDadosDestino());
		System.out.println("Objeto teste2: " + teste2.getBancoDadosDestino());
		System.out.println();
		
		try {
			teste2 = (ParametrosInternos) teste1.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		System.out.println("Após fazer um clone de teste1 para teste2");
		System.out.println("Objeto teste1: " + teste1.getBancoDadosDestino());
		System.out.println("Objeto teste2: " + teste2.getBancoDadosDestino());
		System.out.println();
		
		teste2.setBancoDadosDestino("Novo valor para teste2");		
		
		System.out.println("Após modificar a variável BancoDadosDestino de teste2");
		System.out.println("Objeto teste1: " + teste1.getBancoDadosDestino());
		System.out.println("Objeto teste2: " + teste2.getBancoDadosDestino());
	}

ParametrosInternos.java

public class ParametrosInternos implements Cloneable {  
  
    private String bancoDadosDestino = "";  
  
    public void setBancoDadosDestino(String bancoDadosDestino) {  
        this.bancoDadosDestino = bancoDadosDestino;  
    }  
  
    public String getBancoDadosDestino() {  
        return bancoDadosDestino;  
    }  
    
    protected Object clone() throws CloneNotSupportedException {
		return super.clone();
    }
} 

Se for isso mesmo que queria poste ai.
Vlw.

Isto é normal, para Objetos.

Você, não está copiando e sim compartilhando a referência do endereço da memória.

teste1 - 0XF473
teste2 - 0x6526

teste2 = teste1;

teste1 - 0XF473
teste2 - 0XF473

Para resolver isto, através do método clone();

Valew rafaduka e rodrigorpb, esclareceram legal minha duvida, fico muito grato …