使用内部类(java)有问题

时间:2011-10-20 19:32:22

标签: java inner-classes

我正在尝试使用内部类设置,但是我遇到了一些问题。这是我正在尝试使用的代码:

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中):

No enclosing instance of type GUI is accessible. Must qualify the allocation with an enclosing instance of type GUI (e.g. x.new A() where x is an 
 instance of GUI).

有人可以帮帮我吗?

6 个答案:

答案 0 :(得分:8)

更改声明:

class ButtonHandler implements ActionListener

要:

static class ButtonHandler implements ActionListener

如果没有“static”修饰符,它就是一个实例级内部类,这意味着你需要一个封闭的GUI类的实例来使它工作。如果你把它作为一个“静态”内部类,它就像一个普通的顶级类(隐式静态)。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

让你的内部类静态。 :)

答案 3 :(得分:1)

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

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

如果内部类不需要访问外部类的成员/方法,那么将内部类设为静态,那么就可以像这样创建内部类的实例:

static class ButtonHandler implements ActionListener { ... }

...

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

(在这种情况下,即使是普通new ButtonHandler()也可以,因为someMethod()在外部类GUI中定义,即在与ButtonHandler相同的“名称空间”中<) p>

答案 4 :(得分:0)

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

答案 5 :(得分:0)

你应该使ButtonHandler成为静态类。例如:

static class ButtonHandler implements ActionListener

在Java中,static内部类不需要实例化容器类的实例。你可以简单地new ButtonHandler()(正如你现在所做的那样)。

仅为了您的信息,您还可以更改行

button.addActionListener(new ButtonHandler());

button.addActionListener(this.new ButtonHandler());

但我不推荐它。