2010-03-31 44 views
4

我正在通过练习来理解Java,基本上我需要将两个类的功能合并到一个应用程序中。卡住在Java中的对象范围

虽然我被卡在一个区域 - 跨类的对象的引用。

我所做的是在一个类(test1)中设置了一个gui,并且它在ie中有一个textfield。

chatLine = new JTextField(); 
另一个类(测试2)

,我打算在离开那里的所有功能,并引用在test1的成立,对各种图形元素 - 这样test1.chatLine

我明白这个级别的引用,我通过在测试2级

public static void testpass() { 

     test1.testfield.setText("hello"); 
    } 

我想了解如何实施,虽然在测试2级的更复杂的功能,特别是这个现有的代码设置测试方法测试这一点;

test1.chatLine.addActionListener(new ActionAdapter() { 
      public void actionPerformed(ActionEvent e) { 
       String s = Game.chatLine.getText(); 
       if (!s.equals("")) { 
        appendToChatBox("OUTGOING: " + s + "\n"); 
        Game.chatLine.selectAll(); 

        // Send the string 
        sendString(s); 
       } 
      } 
     }); 

这是我卡上,如果我应该能够做到这一点位 - 因为它是失败的编译,可我的actionadapter东西添加到GUI元素多数民众赞成在test1的坐着,但做这从测试2 - 我想知道如果我试图做一些不可能的事情。

希望这是有道理的,我很困惑这一点 - 我想了解范围和引用的工作原理。

理想情况下,我试图实现的是一个类中有所有主要的东西,gui等,然后在其他类中的所有相关功能,并针对第一类的gui元素与结果等。

任何想法非常感谢。

回答

1

我不清楚chatLine是一个局部变量,一个实例变量还是一个静态变量。这些东西中的任何一个都可能是你编译错误的来源,你没有指定 - 错误是什么?

如果它是一个实例或静态变量,它可以通过将它公开在任何地方使其可见。这并不意味着这是一个好主意。

至少,它应该是私人的,并通过getChatLine()方法公开。

即便如此,这个设计是否正确也存在一些问题,但至少您会在编译器级别和基本数据封装级别上做到这一点。

+0

嗨,道歉 - 我意识到它有点含糊,chatline var是公共静态JTextField chatLine;在test1类中。我将test2中的测试方法推荐给了这个public static void testpass(){} { \t \t \t \t Game.chatLine.setText(“hello”); \t} 它工作,但它的所有test1.chatLine.addActionListener(新的ActionAdapter(),我试图undertsand - 它可能添加侦听器从test2类聊天文本字段,而它是坐在test1类中 – ivor 2010-03-31 11:27:55

+0

可以从任何可以访问chatLine的地方调用chatLine.addActionListener;你可能在其他地方有一个错误,如果你提供了编译器的错误信息可能会有所帮助 – Arkku 2010-03-31 12:08:46

+0

这似乎是我得到的这个错误指向test1.chatLine.addActionListener(new ActionAdapter(); 线程“main”中的异常java.lang.NullPointerException – ivor 2010-03-31 12:54:56

2

如果您首先可以访问chatLine,则可以调用其公共方法,包括addActionListener。要直接访问chatLine,您需要将其设置为public,并且如果您想使其对该类特定(而不是针对该类的每个实例的不同chatLine),则它需要为static

但是,请注意,通常不希望公开变量。首先有类和对象的一个​​重要原因是封装。您可以考虑隐藏类中的实现,将其隐藏起来,只提供更高级别的公共方法来访问所需的内容,例如不要暴露“原始”JTextField,而是暴露您使用它提供的功能。

1

一般来说,Java中的所有内容都是引用的,但是是原始类型。

所谓的物体的可见性是另一回事:

  • public范围的会员可见 所有
  • “套餐友好”的成员(这些 有没有范围明确 提到的)是可见全部属于 属于同一包
  • protected范围成员都是 '包装友好',并可见所有 继承类对象
  • 最后,private作用域成员是 仅可见对象本身 [对象从相同类可以查看 彼此的私有成员(据 我记忆)]

现在,

  • 一个内部静态类可以访问它的 包含类的static成员。
  • A“正常”的内部类(不 静态改性剂)可以访问其 封闭类的成员static和 包围对象的实例 构件 - 即去以及到 匿名内部类。

最后方法的任何链/场要求如下是有效的(但丑陋的),只要一个空的链“引用”没有部分:

myObj.getThatObject().somePublicField.doSomthing().activate().someOtherPublicField 

一个建议,虽然没有申报成员作为公众...

+0

尽管这并没有具体回答这个问题,但我希望你能明白引用...... – Yaneeve 2010-03-31 11:26:25

+0

干杯,这很有帮助 – ivor 2010-03-31 13:16:49