Instanciar Objeto

2 respostas
eduardo.nunessantos

Ola pessoal! gostaria que vocês me ajudacem sobre a diferença da instância desses objetos.
Pois um está sendo instanciado como parâmetro do método e o outro no escopo da classe.

//A classe Cliente está instanciada como parâmetro. 
	public void gravaDados(Cliente cliente){

		try{
			abreBanco();
			String query = "INSERT INTO clientes (nome, sobrenome, email, idade, telefone, sexo) VALUES (?, ?, ?, ?, ?, ?)";
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, cliente.getNome());
			pstmt.setString(2, cliente.getSobrenome());
			pstmt.setString(3, cliente.getEmail());
			pstmt.setInt(4, cliente.getIdade());
			pstmt.setString(5, cliente.getTelefone());
			pstmt.setString(6, cliente.getSexo());
			JOptionPane.showMessageDialog(null, "Dados cadastrados com sucesso!!!");
			pstmt.executeUpdate();
			fechaBanco();
			
		} catch(SQLException exe){
			JOptionPane.showMessageDialog(null, "Erro ao inserir: " + exe);
		}
		
	}

E aqui em baixo está no escopo da classe. qual a diferença de uma forma para a outra? Se puderem me ajudar desde já Obrigado.
Espero que eu tenha cido claro.

package jdbc.mysql.teste;

import javax.swing.JOptionPane;

public class Servisos {

//instancia no escopo da classe.
	Cliente cliente = new Cliente();
	Cadastra cadastra = new Cadastra();
	
	public void pegaDados() {

		cliente.setNome(JOptionPane.showInputDialog("Informe o nome:"));
		cliente.setSobrenome(JOptionPane
				.showInputDialog("Informe o sobrenome:"));
		cliente.setEmail(JOptionPane.showInputDialog("Informe o e-mail:"));
		cliente.setIdade(Integer.parseInt(JOptionPane
				.showInputDialog("Informe a idade:")));
		cliente.setTelefone(JOptionPane.showInputDialog("Informe o telefone:"));
		cliente.setSexo(JOptionPane.showInputDialog("Informe o sexo:"));
		cadastra.gravaDados(cliente);
	}

}

Ate++

2 Respostas

Eric_Yuzo

Acho que você está confundindo a instância de um objeto com a declaração de variáveis.

A variável que for declarada como parâmetro do método, deixará de existir assim que terminar a execução do método.
public void gravaDados(Cliente cliente){
		//Aqui dentro a variável cliente existe. Quando a execução do método se encerrar, cliente (variável) vai junto.
	}
Já a variável que for declarada no escopo da classe, terá o mesmo tempo de vida da instância de Servico.
public class Servisos {
	//Variáveis cliente e cadastro existem enquanto a instância de "Servisos" existir.
	Cliente cliente = new Cliente();
	Cadastra cadastra = new Cadastra();
}
No caso dos objetos (instâncias), o que indica que ele está "vivo" são as referências que ele possui. A partir do momento que nenhuma variável guarda a referência do objeto, ele é candidato a ser coletado pelo GC.
public class Servisos {
	//Variáveis cliente e cadastro existem enquanto a instância de "Servisos" existir.
	Cliente cliente = new Cliente();    //cliente guarda a referência da nova instância de Cliente.
	Cadastra cadastra = new Cadastra(); //cadastro guarda a referência da nova instância de Cadastro.
	
	public void pegaDados() {
		//Aqui os métodos do objeto criado lá em cima serão chamados pela referência da variável "cliente".
		cliente.setNome(JOptionPane.showInputDialog("Informe o nome:"));
		cliente.setSobrenome(JOptionPane
				.showInputDialog("Informe o sobrenome:"));
		cliente.setEmail(JOptionPane.showInputDialog("Informe o e-mail:"));

		//Vamos supor que eu não quero mais usar o cliente que havia sido criado. E decido instanciar um novo cliente.
		cliente = new Cliente(); //Aqui estou usando a variável cliente para guardar a referência de um novo "Cliente". A partir de agora a instância de Cliente criada anteriormente não possui mais referência e pode ser coletado pelo GC.

		//A partir daqui os métodos do Cliente que acabamos de instanciar serão executados. Portanto, a idade, o telefone e o sexo serão gravados. Porém o nome, o sobrenome e o e-mail se perderam junto com o primeiro objeto de Cliente.
		cliente.setIdade(Integer.parseInt(JOptionPane
				.showInputDialog("Informe a idade:")));
		cliente.setTelefone(JOptionPane.showInputDialog("Informe o telefone:"));
		cliente.setSexo(JOptionPane.showInputDialog("Informe o sexo:"));
		cadastra.gravaDados(cliente);
	}

	public void zerarCliente() {
		//A partir de agora cliente não segura a referência de nenhum objeto. Mas a variável cliente continua existindo.
		cliente = null;
	}

}
O que quero dizer é que apesar da variável existir enquanto a instância de Servisos existir. Não significa que o objeto que ele referencia também existirá.

Cara, eu não tenho muita criatividade para bolar exemplos então usei o seu próprio código. Se estiver muito confuso, só avisar que agente tenta resolver.

Falou...

eduardo.nunessantos

Ok Eric Yuzo! Consegui entender muito bem sua explicação.

Obrigado por compartilhar o seu conhecimento.

Falow!!!

Criado 26 de setembro de 2010
Ultima resposta 26 de set. de 2010
Respostas 2
Participantes 2