使用内部类(java)时出现问题

使用内部类(java)时出现问题,java,inner-classes,Java,Inner Classes,我试图使用一个内部类设置,但是我有一些问题。这是我试图使用的代码: public class GUI { class ButtonHandler implements ActionListener { public void actionPerformed(ActionEvent e) { // do something } } private static void someMethod() {

我试图使用一个内部类设置,但是我有一些问题。这是我试图使用的代码:

public class GUI
{
   class ButtonHandler implements ActionListener
   {
       public void actionPerformed(ActionEvent e)
       {
         // do something
       }
   }

   private static void someMethod()
   {
      JButton button = new JButton( "Foo" );
      button.addActionListener(new ButtonHandler());
   }
}
这是我(在eclipse中)收到的错误消息:


有人能帮我吗?

将声明更改为:

class ButtonHandler implements ActionListener
致:

没有“static”修饰符,它是一个实例级的内部类,这意味着您需要一个封闭的
GUI
类的实例才能工作。如果将其设置为“静态”内部类,则它将充当普通的顶级类(隐式静态)


(在您的示例中,这是必要的关键原因是
someMethod
是静态的,因此在该上下文中没有封闭类的实例。)

使内部类成为静态的:

我相信这会给您带来这个错误,因为这是在静态方法中完成的。由于
ButtonHandler
是一个非静态嵌套类,因此它必须绑定到一个封闭的
GUI
实例。很可能您只需要一个静态嵌套类:

static class ButtonHandler implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
      // do something
    }
}

要创建非静态内部类的实例,需要有一个周围外部类的实例(没有,因为
someMethod
是静态的):

如果内部类不需要访问外部类的成员/方法,请将内部类设置为静态,然后可以创建内部类的实例,如下所示:

static class ButtonHandler implements ActionListener { ... }

...

JButton button = new JButton( "Foo" );
button.addActionListener(new GUI.ButtonHandler());

(在这种情况下,即使是普通的
new ButtonHandler()
也可以工作,因为
someMethod()
是在外部类
GUI
中定义的,即与
ButtonHandler
在同一个“命名空间”中)。

您试图从静态成员中访问非静态成员。当您在静态函数中访问ButtonHandler时,成员类不可见,因为它与GUI类的实例关联。

您应该将
ButtonHandler
设置为静态类。例如:

static class ButtonHandler implements ActionListener
在Java中,
static
内部类不需要容器类的实例来实例化。您只需执行
newbuttonhandler()
(与当前操作相同)

仅供参考,您也可以更改线路

button.addActionListener(new ButtonHandler());


但我不推荐它。

这是一个奇怪的例子。通常,当您创建这样的侦听器时,您希望它能够访问外部类实例。像按钮这样的组件必须位于另一个组件中。使用静态方法没有多大意义。所以,即使每个人都告诉你让你的内部类保持静态,你可能会有更大的问题。查看Oracle Swing教程,了解如何制作Swing GUI的示例
static class ButtonHandler implements ActionListener { ... }

...

JButton button = new JButton( "Foo" );
button.addActionListener(new GUI.ButtonHandler());
static class ButtonHandler implements ActionListener
button.addActionListener(new ButtonHandler());
button.addActionListener(this.new ButtonHandler());