[Dúvida] - Referência em memória

4 respostas
robison.Aleixo

Olá pessoal é um prazer poder fazer parte dessa família GUJ, estou iniciando em programação Java, por isso antes de postar minha dúvida preço desculpas antecipada se eu não for claro. Pesquisei sobre o assunto mais não obtive sucesso então resolvi finalmente postar :smiley: .

A dúvida é a seguinte: estou utilizando de uma apostila chamada Caelum, em um dos exemplos tive um pequeno problema meu código não condiz com o que é dito na apostila, segue o mesmo abaixo;

public class Programa {
	public static void main(String args[]){
		Conta c1 = new Conta();
		Conta c2 = //Copia a variável c1 que referece ao objeto Conta /""copia sua referência NÃO os atributos""/ (Pelomenos eu acho hahaha)
		
		//Altera os valores de c2
		c2.dono = "Robison";
		c2.deposita(200);
		
		//Alterando os valores de c1
		c1.dono = "Duke";
		c1.saldo = 1000.0;
		
		//Sacando c1
		c1.saca (200);
		
		//Deposita c1
		c1.deposita(500);

		System.out.println ("Saldo atual: " + c1.dono + " " + c1.saldo); //mostra o saldo atual de c1
		System.out.println ("Saldo atual: " + c2.dono + " " + c2.saldo);
	}
}
class Conta {
	int numero;
	String dono;
	double saldo;
	double limite;
	
	boolean saca (double valor) {
		if (this.saldo < valor) {
			return false; //não vai sacar, está sacando mais do que o valor atual			
		}
		else {
			this.saldo = this.saldo - valor;
			return true;
		}		
	}
	
	void deposita (double quantidade) {
		this.saldo += quantidade;		
	} 
	
	boolean transfere (Conta destino, double valor) {
		boolean retirou = this.saca (valor);
		if (retirou == false) {
			return false;
		}
		else {
			destino.deposita (valor);
			return true;
		}
	}		   
}

Como vocês podem ver é um exemplo de conta bancaria, o problema é que na apostila diz que; para criar uma segunda variável a partir de uma já existente que se refere a um objeto, utiliza-se:

Conta c1 = new Conta();
Conta c2 = c1; //Copia a variável c1 que referece ao objeto Conta /""copia sua referência NÃO os atributos""/ (Pelomenos eu acho hahaha)

Só que quando faço isso é copiado os atributos do objeto c1. Gostaria de saber entendi errado ou estou fazendo alguma coisa errada?

4 Respostas

Adelar

Olá Robison,
sim está certo, a não ser que o operador de atribuição esteja sobrecarregado.
veja este link acho que pode te ajudar: http://0xc0de.wordpress.com/2009/06/27/construtor-de-copia-e-operador-de-atribuicao/

um abraço

robison.Aleixo

Olá Adelar, muito obrigado por responder.
Então acho que pode ser isso mesmo que você falou “o operador de atribuição esteja sobrecarregado”.
Pois, quando rodo o código acima ele retorna os mesmos atributos da variável c1.

Duke, saldo atual: 1300.0
Robison, saldo atual: 1300.0

Olhei o link que você postou mais não entendi muito bem. :oops:

Como posso consertar isso?

Abraço

Adelar

Olá Robinson,
no caso apresentado c1 e c2 acabam apontando para o mesmo objeto, por isto possuem valores iguais. Caso você queira fazer um novo objeto deve ser disponibilizado na classe um construtor de cópia. Um construtor de cópia basicamente inicializa os parâmetros de um objeto tendo como base um objeto de exemplo. Veja o código abaixo:

public class Aluno {
   String nome;

   // construtor padrão
   public Aluno(String nome){
      this.nome=nome;
   }

   // construtor de cópia
   public Aluno(Aluno copia){
      // usando o construtor padrão para preencher os dados do novo objeto
      this(copia.nome);
   }

   // método de clonagem
   public Object clone(){
      // chama o construtor de copia
      return new Aluno(this);
   }

   public void setNome(String a){
      this.nome=a;
   }

   public String getNome(){
      return this.nome;
   }

}

/** Usando
*/
Aluno aluno1=new Aluno("Joao");

// agora outro aluno chamado Joao, com os mesmos dados, mas não é a mesma pessoa/objeto
Aluno aluno2=new Aluno(aluno1);
// ou de uma forma mais rápida
Aluno aluno2=aluno1.clone();

o operador de atribuição sobrecarregado nada mais é que um acesso mais rápido ao construtor de cópia :slight_smile:

um abraço.

robison.Aleixo

Nossa obrigado mesmo, esse método eu não conhecia.

abraço

Criado 21 de novembro de 2009
Ultima resposta 23 de nov. de 2009
Respostas 4
Participantes 2