0

我是 Java swing 的第一次用户,这是我第一次尝试使用私有类。

我正在尝试以下代码 -

ActionListener listener = new AddButtonListener();

其中 AddButtonListener 是实现 ActionListener 接口的私有类。

private class AddButtonListener implements ActionListener{
  public void actionPerformed(ActionEvent e){
  ....
  }
}

但是,我收到一个日食错误,内容为

无法访问 someType 类型的封闭实例。必须使用 someType 类型的封闭实例来限定分配(例如 xnew A(),其中 x 是 someType 的实例)。

请注意,该类是在 someType 内的静态 main 方法中实例化的。

为什么会出现这个错误?是因为main方法是静态的吗?

4

3 回答 3

5

由于 AddButtonListener 是一个内部类并且不是静态的,它只能使用外部类的对象来实例化。

例如,如果您的 AddButtonListener 类是在 SomeType 中定义的,那么

SomeType obj = new SomeType();

SomeType.AddButtonListener listener = obj.new AddButtonListener();

如果您在 SomeType 中的某个方法中,那么您将创建这个非静态内部类的对象

AddButtonListener listener = this.new AddButtonListener();

如果要创建 AddButtonListener 的实例而不使用 SomeType(封闭类型)的实例,则应将 AddButtonListener 标记为静态类。

private static class AddButtonListener implementsActionListener{
    public void actionPerformed(ActionEvent e){
        ....
    }
}

所以,这不是关于类是私有的,而是关于它不是静态的。

于 2012-10-21T03:45:24.447 回答
2

异常消息几乎解释了一切。

私有类需要存在其封闭类型的实例才能实例化。由于私有类可以访问封闭类型实例中的成员,如果不存在这样的实例,那么私有类实例在哪里可以访问封闭类型中的成员?

回到你的问题。

如果您想创建一个实例而不必创建其他实例。您可以声明您的AddButtonListeneras private static class,但这将AddButtonListener失去访问SomeType类 insatnce 中的成员的能力。

或者,您必须使用这样的语法。

SomeType t = new SomeType();
AddButtonListener listener = t.new AddButtonListener();

但是,我无法确定哪种方式在您的情况下是正确的,因为您没有提供任何详细代码。因为根据我的经验,在封闭类中使用私有类时不应该有这样的问题。除非您尝试在主要方法或其他方法中对其进行测试..

于 2012-10-21T03:55:45.423 回答
2

维克多是对的。但是对于这种情况(监听器只使用一次),您通常使用匿名类:

...
ActionListener listener = new ActionListener(){

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub          
    }       

};
...

在这里,您通过扩展所需的接口或类来定义方法内部的类。

于 2012-10-21T03:59:32.417 回答