为啥我需要静态修饰符以及如何修复它?
Posted
技术标签:
【中文标题】为啥我需要静态修饰符以及如何修复它?【英文标题】:Why do i require a static modifier and how do i fix it?为什么我需要静态修饰符以及如何修复它? 【发布时间】:2013-09-10 17:39:00 【问题描述】:我的 Eclipse 告诉我需要使用静态修饰符,但是当我这样做时,洞的事情就出错了。这是我的代码我希望你能帮助我并告诉我我做错了什么(我从 StealthyHunter7 得到了内部类的提示):
public class ClickBot
private class Key
implements KeyListener
private boolean spacebarPressed = false;
@Override
public void keyTyped(KeyEvent e)
@Override
public void keyPressed(KeyEvent e)
if(e.getKeyCode() == KeyEvent.VK_SPACE)
spacebarPressed = true;
@Override
public void keyReleased(KeyEvent e)
if(e.getKeyCode() == KeyEvent.VK_SPACE)
spacebarPressed = false;
public boolean isSpacebarPressed()
return spacebarPressed;
Key keyObject = new Key();
public static void main(String[] args) throws IOException, AWTException
JFrame.addKeyListener(keyObject);
final Robot robot = new Robot();
robot.delay(2000);
while(keyObject.spacebarPressed())
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
robot.delay(30);
【问题讨论】:
【参考方案1】:以下不能是字段,而是放在main方法中,即静态的。
Key keyObject = new Key();
在 Key 类中初始化 Key 字段后,看看 new Key()
会发生什么:
;)
更正: 我没有看到这是两个嵌套类。将内部类设为静态。
private static class Key
否则类 Key 持有一个 `ClickBot.this',然后递归开始。
【讨论】:
【参考方案2】:您的main
方法是静态的,因此,您不能访问非静态变量。如果您不想在 Key
对象上使用 static
,请执行以下操作:
1) 为您的 ClickBot
类创建一个构造函数
2) 在里面初始化keyObject
2) 在您的main
方法中创建ClickBot
的实例
3) 在 ClickBot
类中创建一个新方法 (public void methodName()
)
4) 将所有进一步的代码放入其中
5) 在您的 main
方法中调用 clickBotObject.methodName()
。
否则,如果您的Key
对象上的static
对您来说没问题,那么只需在其上添加static
。
或者,如果您可以的话,在您的 main
方法中将其设为局部变量。
【讨论】:
【参考方案3】:您正在尝试将keyObject
用作main 方法中ClickBot
的类成员,这当然是static
。因此,当您在 main
中时,您没有 ClickBot
实例,这意味着您不能使用类成员。
因此,要解决此问题,要么将 keyObject
移动到 main 方法中 (1),要么将 keyObject
设为静态 (2)。
这里是怎么做(1):
public static void main(String[] args) throws IOException, AWTException
// Move it to here:
Key keyObject = new Key();
JFrame.addKeyListener(keyObject);
final Robot robot = new Robot();
robot.delay(2000);
while(keyObject.spacebarPressed())
....
这里是(2):
// Make it static:
static Key keyObject = new Key();
public static void main(String[] args) throws IOException, AWTException
JFrame.addKeyListener(keyObject);
final Robot robot = new Robot();
robot.delay(2000);
....
【讨论】:
我将它移到主方法,但它仍然说它不能“对非静态方法添加键监听器进行静态引用:(我该怎么办? 哦,您对 JFrame 也是如此。首先创建一个 JFrame 实例:JFrame frame = new JFrame(); frame.addKeyListener(...);
以上是关于为啥我需要静态修饰符以及如何修复它?的主要内容,如果未能解决你的问题,请参考以下文章
为啥这个函子的 operator() 需要尾随 const 修饰符?
Smarty:如何修复“未知修饰符'rewrite'”异常?