【问题标题】: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);   
            }
        }
    }
}

【问题讨论】:

    标签: java static modifier


    【解决方案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(...);
        猜你喜欢
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-29
        相关资源
        最近更新 更多