为啥我需要静态修饰符以及如何修复它?

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() 会发生什么:

创建了一个 Key 实例,它有一个必须实例化的字段 Key 创建了一个 Key 实例,它有一个必须实例化的字段 Key 创建了一个 Key 实例,它有一个必须实例化的字段 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(...);

以上是关于为啥我需要静态修饰符以及如何修复它?的主要内容,如果未能解决你的问题,请参考以下文章

为啥Java限制隐藏方法的访问修饰符[关闭]

为啥这个函子的 operator() 需要尾随 const 修饰符?

Smarty:如何修复“未知修饰符'rewrite'”异常?

为啥有类级访问修饰符而不是对象级?

Java基础:常见修饰符(权限修饰符以及abstractstaticfinal等)与变量的描述

如何使用修饰符控制继承?