困在Java中的Object范围

时间:2010-03-31 11:09:36

标签: java oop

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

我被困在一个区域 - 跨类引用对象。

我所做的是在一个类(test1)中设置一个gui,并且它有一个文本域,即。

chatLine = new JTextField();

在另一个类(test2)中,我计划将所有功能留在那里并引用test1中设置的各种gui元素 - 比如test1.chatLine

我理解这种引用级别,我通过在test2类中设置测试方法来测试它

public static void testpass() {

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

我试图了解如何在test2类中实现更复杂的功能,特别是现有的代码;

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内容添加到位于test1中的gui元素,但是从test2执行此操作 - 我想知道我是否正在尝试做一些不可能的事情。

希望这是有道理的,我对此非常困惑 - 我正在努力了解范围和引用的工作原理。

理想情况下,我想要实现的是一个具有所有主要内容的类,gui等,然后是其他类中的所有相关功能,并将第一个类的gui元素作为结果等目标。

任何想法都非常感激。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

如果它是实例或静态变量,则可以通过将其公开来从任何位置显示它。这并不意味着这是一个好主意。

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

即便如此,关于这种设计是否是正确的设计存在一些问题,但至少你是在编译器级别和基本数据封装级别上做的。

答案 2 :(得分:1)

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

所谓的对象可见性是另一回事:

  • public范围成员可见 全部
  • '包友好'会员(那些 没有明确的范围 提到的)对所有人都是可见的 属于同一个包
  • protected范围成员都是 '包装友好',所有人都可以看到 继承类对象
  • 最后,private范围内的成员是 仅对对象本身可见 [来自同一类的对象可以查看 彼此的私人成员(到目前为止) 我记得)]

现在,

  • 内部静态类可以访问它 附上班级的static成员。
  • 一个'正常'的内部阶级(没有 static modifier)可以访问它 封闭班级的static成员 并包含对象的实例 成员 - 也是如此 匿名的内部阶级。

最后,只要链的任何部分'引用'为null,任何方法/字段调用链如下都是有效的(但很难看):

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

但建议不要将成员宣布为公开......