无法实例化私有类

时间:2012-10-21 03:39:59

标签: java swing jbutton actionlistener

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

我正在尝试以下代码 -

ActionListener listener = new AddButtonListener();

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

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

但是,我收到了一个读取

的日食错误
  

无法访问someType类型的封闭实例。必须符合资格   带有someType类型的封闭实例的分配(例如   x.new A()其中x是someType的实例。

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

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

3 个答案:

答案 0 :(得分:5)

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

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

SomeType obj = new SomeType();

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

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

AddButtonListener listener = this.new AddButtonListener();

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

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

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

答案 1 :(得分:2)

异常消息几乎解释了所有。

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

回到你的问题。

如果要创建实例而不必创建其他实例。您可以将AddButtonListener声明为private static class,但这会使AddButtonListener无法在SomeType班级失访中访问该成员。

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

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

但是,由于您未提供任何详细代码,因此我无法确定您的情况是正确的。因为根据我的经验,当你在它的封闭类中使用私有类时,你不应该有这样的问题。除非你试图用主方法或其他方法测试它..

答案 2 :(得分:2)

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

...
ActionListener listener = new ActionListener(){

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

};
...

在这里,您可以通过扩展所需的接口或类来定义方法中的类onde。

相关问题