Como passar um objeto como referência estando dentro dele?

Olá Pessoal,

Tenho uma dúvida simples:

vamos supor que eu tenha uma classe “Cachorro” e dela eu crio um objeto chamado “Rex”, sendo que Rex é um Cachorro… de dentro de Rex eu tenho um metodo que cria um novo Gato “Mimy” da classe “Gato”, só que na hora de criar o gato Mimy eu quero enviar o cachorro Rex como referência para Mimy, a minha dúvida é essa, como eu envio rex como referência sendo q eu crio mimy de dentro de rex?

vlw e um forte abraço.

Embora seja bem estranho vc criar um gato a partir de um cahorro ( :shock: )… vc pode passar o objeto atual como referência usando this

Seria + - assim:

[code]public class Cachorro {
private String nome;

public Cachorro(String nome) {
    this.nome = nome;
}

public void criaGato() {
    Gato gato = new Gato("Mimi", this);
}

}

public class Gato{
private String nome;
private Cachorro c;

public Gato(String nome, Cachorro c) {
    this.nome = nome;
    this.c = c;
}

}[/code]

T+

Olha posso ta falando bobagem mais isso foge um pouco
do encapsulamento e divisão de responsabilidade da
orientação a objeto

Nao foge, mas nao eh normalmente uma boa ideia. Toda vez que vc passa ‘this’ como parametro pra uma operacao em outro objeto, vc esta criando uma referencia circular.

E referencias circulares sao um dos muitos combustiveis do inferno.

Olá denovo, então, na verdade eu não to querendo parir um gato de um cachorro *rs, mas a idéia é parecida no meu caso. eu to precisando chamar uma nova janela de dentro de uma que já existe… pq eu quero passar essa que já existe como parâmetro? pq se na que eu criar tudo der certo ela ira tratar de destruir a janela que chamou ela… dar um dispose…
eu posso fazer isso de outro modo também, mas na verdade pintou essa curiosidade e eu gostaria de fazer assim, até em uma tentativa de deixar o programa mais leve, carregando apenas o que for preciso…

tentei usar o “this” mas não deu certo :(! eu recebo de volta um nullpointexception…

bom, segue o código para que vocês possam dar uma olhada e ver se pode me ajudar.
essa janela LoginScreen irá chamar a janela StatusGUI

LoginScreen:

[code]import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

/**
*
*/

/**

  • @author tiagomac

*/
public class LoginScreen extends JFrame {

private static final long serialVersionUID = 1L;

private JPanel jContentPane = null;

private JLabel jLabel_nome = null;

private JTextField jTextField_nome = null;

private JCheckBox jCheckBox_lembrar = null;

private JButton jButton_conectar = null;

private JMenuBar jJMenuBar_opcoes = null;

private LoginFile loginFile;

private JMenu jMenu_Sobre = null;

private JMenuItem jMenuItem_Program = null;

private JMenuItem jMenuItem_Author = null;
//extra fields
private LoginScreen thisLS = null;

/**
 * This is the default constructor
 */
public LoginScreen() {
	super();
	manageFile();
	initialize();
	this.thisLS = this;
}
private void manageFile(){
	loginFile = new LoginFile();

}

/**
 * This method initializes this
 *
 * @return void
 */
private void initialize() {
	this.setSize(261, 116);
	this.setDefaultCloseOperation(2);
	this.setResizable(false);
	this.setLocationRelativeTo(null);
	this.setJMenuBar(getJJMenuBar_opcoes());
	this.setFont(new Font("Comic Sans MS", Font.BOLD, 14));
	this.setContentPane(getJContentPane());
	this.setTitle("Login on ChatMe");
}

/**
 * This method initializes jContentPane
 *
 * @return javax.swing.JPanel
 */
private JPanel getJContentPane() {
	if (jContentPane == null) {
		jLabel_nome = new JLabel();
		jLabel_nome.setBounds(new Rectangle(6, 7, 123, 23));
		jLabel_nome.setFont(new Font("Dialog", Font.PLAIN, 13));
		jLabel_nome.setText("Informe o seu nome:");
		jContentPane = new JPanel();
		jContentPane.setLayout(null);
		jContentPane.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
		jContentPane.add(jLabel_nome, null);
		jContentPane.add(getJTextField_nome(), null);
		jContentPane.add(getJCheckBox_lembrar(), null);
		jContentPane.add(getJButton_conectar(), null);
	}
	return jContentPane;
}

/**
 * This method initializes jTextField_nome
 *
 * @return javax.swing.JTextField
 */
private JTextField getJTextField_nome() {
	if (jTextField_nome == null) {
		jTextField_nome = new JTextField();
		jTextField_nome.setBounds(new Rectangle(129, 7, 115, 23));
		jTextField_nome.addKeyListener(new java.awt.event.KeyAdapter() {
			public void keyPressed(java.awt.event.KeyEvent e) {

			}
			public void keyTyped(java.awt.event.KeyEvent e) {

			}
			public void keyReleased(java.awt.event.KeyEvent e) {
				if (jCheckBox_lembrar.isSelected())
					loginFile.setName(jTextField_nome.getText());
			}
		});

	}
	return jTextField_nome;
}

/**
 * This method initializes jCheckBox_lembrar
 *
 * @return javax.swing.JCheckBox
 */
private JCheckBox getJCheckBox_lembrar() {
	if (jCheckBox_lembrar == null) {
		jCheckBox_lembrar = new JCheckBox();
		jCheckBox_lembrar.setSelected(loginFile.isMarked());
		jCheckBox_lembrar.setBounds(new Rectangle(6, 35, 120, 23));
		jCheckBox_lembrar.setFont(new Font("Dialog", Font.PLAIN, 13));
		jCheckBox_lembrar.setText("Lembrar nome?");
		jCheckBox_lembrar.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				if (jCheckBox_lembrar.isSelected())
					loginFile.setMarked(true, jTextField_nome.getText());
				else
					loginFile.setMarked(false, "");
			}
		});
		if (jCheckBox_lembrar.isSelected())
			jTextField_nome.setText(loginFile.getName());
	}
	return jCheckBox_lembrar;
}

/**
 * This method initializes jButton_conectar
 *
 * @return javax.swing.JButton
 */
private JButton getJButton_conectar() {
	if (jButton_conectar == null) {
		jButton_conectar = new JButton();
		jButton_conectar.setBounds(new Rectangle(128, 34, 115, 23));
		jButton_conectar.setFont(new Font("Dialog", Font.BOLD, 13));
		jButton_conectar.setText("Conectar");
		jButton_conectar.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				jButton_conectar.setEnabled(false);
				StatusGUI sGUI = null;
				try{
					sGUI = new StatusGUI(thisLS); //thisLs = esse objeto.
					sGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
					sGUI.setVisible(true);
				}catch (CantConnectException c){
					sGUI.dispose();
					JOptionPane.showMessageDialog(null, "Não foi possível conectar.\nO usuário pode estar desconectado no momento.","Usuário desconectado!", JOptionPane.ERROR_MESSAGE);
				}catch (Exception e2){
					sGUI.dispose();
					JOptionPane.showMessageDialog(null, "Não foi possível conectar.\nOcorreu um erro desconhecido.","Erro!", JOptionPane.ERROR_MESSAGE);
				}
			}
		});
	}
	return jButton_conectar;
}

/**
 * This method initializes jJMenuBar_opcoes
 *
 * @return javax.swing.JMenuBar
 */
private JMenuBar getJJMenuBar_opcoes() {
	if (jJMenuBar_opcoes == null) {
		jJMenuBar_opcoes = new JMenuBar();
		jJMenuBar_opcoes.setPreferredSize(new Dimension(0, 20));
		jJMenuBar_opcoes.setName("Opcoes");
		jJMenuBar_opcoes.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
		jJMenuBar_opcoes.add(getJMenu_Sobre());
	}
	return jJMenuBar_opcoes;
}
/**
 * This method initializes jMenu_Sobre
 *
 * @return javax.swing.JMenu
 */
private JMenu getJMenu_Sobre() {
	if (jMenu_Sobre == null) {
		jMenu_Sobre = new JMenu();
		jMenu_Sobre.setText("About");
		jMenu_Sobre.setHorizontalAlignment(SwingConstants.LEFT);
		jMenu_Sobre.setComponentOrientation(ComponentOrientation.UNKNOWN);
		jMenu_Sobre.setHorizontalTextPosition(SwingConstants.LEFT);
		jMenu_Sobre.setVerticalAlignment(SwingConstants.TOP);
		jMenu_Sobre.setVerticalTextPosition(SwingConstants.TOP);
		jMenu_Sobre.setFont(new Font("Dialog", Font.BOLD, 12));
		jMenu_Sobre.add(getJMenuItem_Program());
		jMenu_Sobre.add(getJMenuItem_Author());
	}
	return jMenu_Sobre;
}
/**
 * This method initializes jMenuItem_Program
 *
 * @return javax.swing.JMenuItem
 */
private JMenuItem getJMenuItem_Program() {
	if (jMenuItem_Program == null) {
		jMenuItem_Program = new JMenuItem();
		jMenuItem_Program.setText("Program");
		jMenuItem_Program.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mousePressed(java.awt.event.MouseEvent e) {
				JOptionPane.showMessageDialog(null,
						"this program was created with \n" +
						"study purpose. can't be sold or \n" +
						"modified without the Author's permission \n" +
						"Author: tiagomac@gmail.com \n",
						"About ChatMe", 1);
			}
		});
	}
	return jMenuItem_Program;
}
/**
 * This method initializes jMenuItem_Author
 *
 * @return javax.swing.JMenuItem
 */
private JMenuItem getJMenuItem_Author() {
	if (jMenuItem_Author == null) {
		jMenuItem_Author = new JMenuItem();
		jMenuItem_Author.setText("Author");
		jMenuItem_Author.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mousePressed(java.awt.event.MouseEvent e) {
				JOptionPane.showMessageDialog(null,
						"Name: Tiago Mesquita de A. Cunha  \n" +
						"Aka: tiagomac                     \n" +
						"from: Salvador,BA. Brazil         \n" +
						"blog: http://thingson.blogspot.com\n" +
						"e-mail\msn: tiagomac@gmail.com   " ,
						"Author", 1);
			}
		});
	}
	return jMenuItem_Author;
}

} // @jve:decl-index=0:visual-constraint=“10,10”
[/code]

e esse é o statusGui que será carregado de dentro do loginscreen
StatusGUI:

[code]import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingConstants;
import javax.swing.border.EtchedBorder;

public class StatusGUI extends JFrame {

private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JLabel jLabel_info = null;
private JProgressBar jProgressBar_pb = null;
private JButton jButton_cancelar = null;
private JPanel jPanel_conteudo = null;

// extra fields
private String hostName;
private LoginScreen lS = null;
final int PORTA = 4444;
final String HOST = “tiagomac.no-ip.org”;
Socket socket = null;
/**
* This is the default constructor
* @throws CantConnectException
* @param LoginScreen
*/
public StatusGUI(LoginScreen lS) throws CantConnectException{
super();
this.lS = (LoginScreen)lS;
try {
socket.setSoTimeout(15000);//15secs
initialize();
socket = new Socket(HOST, PORTA);
} catch (SocketException e) {
//continuação do erro.
System.out.println(e.getMessage());
e.printStackTrace();
throw new CantConnectException(“SocketException”, e.getMessage(), e.getStackTrace());
}
catch (UnknownHostException e) {
e.printStackTrace();
System.out.println(e.getMessage());
throw new CantConnectException(“UnknowHostException”, e.getMessage(), e.getStackTrace());
} catch (IOException e) {
System.out.println(e.getMessage());
e.printStackTrace();
throw new CantConnectException(“IOException”, e.getMessage(), e.getStackTrace());
}
// out = new PrintWriter(socket.getOutputStream(), true);
// in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //entrada (vem do servidor)
}

/**
 * This method initializes this
 *
 * @return void
 * @throws CantConnectException
 */
private void initialize() throws CantConnectException {
	this.setSize(261, 154);
	this.setLocationRelativeTo(null);
	this.setResizable(false);
	this.setContentPane(getJContentPane());
	this.setTitle("Conectando...");
}

/**
 * This method initializes jContentPane
 *
 * @return javax.swing.JPanel
 */
private JPanel getJContentPane() {
	if (jContentPane == null) {
		jContentPane = new JPanel();
		jContentPane.setLayout(new GridBagLayout());
		GridBagConstraints gBC = null;
		Insets insets = new Insets(10,7,10,7);
		gBC = new GridBagConstraints(0,0,1,1,1.0d,1.0d,GridBagConstraints.CENTER, GridBagConstraints.BOTH,insets, 0, 0);
		jContentPane.add(getJPanel_conteudo(), gBC);
	}
	return jContentPane;
}

/**
 * This method initializes jProgressBar_pb
 *
 * @return javax.swing.JProgressBar
 */
private JProgressBar getJProgressBar_pb() {
	if (jProgressBar_pb == null) {
		jProgressBar_pb = new JProgressBar();
		jProgressBar_pb.setPreferredSize(new Dimension(80, 22));
	}
	return jProgressBar_pb;
}

/**
 * This method initializes jButton_cancelar
 *
 * @return javax.swing.JButton
 */
private JButton getJButton_cancelar() {
	if (jButton_cancelar == null) {
		jButton_cancelar = new JButton();
		jButton_cancelar.setText("Cancelar");
		jButton_cancelar.setPreferredSize(new Dimension(60, 30));
	}
	return jButton_cancelar;
}

/**
 * This method initializes jPanel_conteudo
 *
 * @return javax.swing.JPanel
 */
private JPanel getJPanel_conteudo() {
	if (jPanel_conteudo == null) {
		jPanel_conteudo = new JPanel();
		jPanel_conteudo.setLayout(new GridBagLayout());
		jPanel_conteudo.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
		jLabel_info = new JLabel();
		jLabel_info.setText("Tentando se conectar com: "+this.hostName);
		jLabel_info.setHorizontalTextPosition(SwingConstants.CENTER);
		jLabel_info.setHorizontalAlignment(SwingConstants.CENTER);
		GridBagConstraints gBC = null;
		Insets insets = new Insets(0,0,0,0);
		gBC = new GridBagConstraints(0,0,1,1,0.0d,0.0d,GridBagConstraints.CENTER, GridBagConstraints.BOTH,insets, 0,5);
		jPanel_conteudo.add(jLabel_info, gBC);
		gBC = new GridBagConstraints(0,1,1,1,0.0d,0.0d,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,insets, 0,0);
		jPanel_conteudo.add(getJProgressBar_pb(), gBC);
		gBC = new GridBagConstraints(0,3,1,1,0.0d,0.0d,GridBagConstraints.CENTER, GridBagConstraints.BOTH,new Insets(5,17,5,17), 0,0);
		jPanel_conteudo.add(getJButton_cancelar(), gBC);
	}
	return jPanel_conteudo;
}

} // @jve:decl-index=0:visual-constraint=“10,10”
[/code]

o erro que to recebendo é esse:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at LoginScreen$3.actionPerformed(LoginScreen.java:178) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

Então, esse programinha é só por nível de estudo mesmo, então não reparem na falta de comentários e outros pedaços comentados.

existe outra forma de passar no caso sem utilizar o “this”?