我正在通过练习来理解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元素作为结果等目标。
任何想法都非常感激。
答案 0 :(得分:2)
如果您可以首先访问chatLine
,则可以调用其(公共)方法,包括addActionListener
。要直接访问chatLine
,您需要将其设为public
,如果您想使其专用于该类(而不是针对该类的每个实例使用不同的chatLine
),它必须是static
。
但是,请注意,通常不希望变量公开。首先拥有类和对象的一个重要原因是封装。您可以考虑将实现隐藏在类中,方法是将其设置为私有,并且只提供更高级别的公共方法来访问所需的内容,例如,不要公开“原始”JTextField
,而是公开您使用它提供的功能。
答案 1 :(得分:1)
我不清楚chatLine是局部变量,实例变量还是静态变量。这些东西中的任何一个都可能是你没有指定的编译错误的来源 - 错误是什么?
如果它是实例或静态变量,则可以通过将其公开来从任何位置显示它。这并不意味着这是一个好主意。
至少,它应该是私有的,并通过getChatLine()方法公开。
即便如此,关于这种设计是否是正确的设计存在一些问题,但至少你是在编译器级别和基本数据封装级别上做的。
答案 2 :(得分:1)
一般来说,Java中的所有内容都是引用但是原始类型。
所谓的对象可见性是另一回事:
public
范围成员可见
全部protected
范围成员都是
'包装友好',所有人都可以看到
继承类对象private
范围内的成员是
仅对对象本身可见
[来自同一类的对象可以查看
彼此的私人成员(到目前为止)
我记得)] 现在,
static
成员。static
成员
并包含对象的实例
成员 - 也是如此
匿名的内部阶级。最后,只要链的任何部分'引用'为null,任何方法/字段调用链如下都是有效的(但很难看):
myObj.getThatObject().somePublicField.doSomthing().activate().someOtherPublicField
但建议不要将成员宣布为公开......