繁体   English   中英

无法实例化私人班级

[英]Cannot Instantiate Private Class

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

我正在尝试以下代码-

ActionListener listener = new AddButtonListener();

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

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

但是,我遇到了一个日蚀错误,显示为

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

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

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

由于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){
        ....
    }
}

因此,这不是关于该类是私有的,而是关于它不是静态的。

异常消息几乎可以解释所有问题。

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

回到您的问题。

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

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

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

但是,由于您未提供任何详细代码,因此我无法确定哪种方法正确。 因为以我的经验,在封闭类中使用私有类时,您应该不会遇到此类问题。 除非您尝试使用主要方法或其他方法进行测试。

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

...
ActionListener listener = new ActionListener(){

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

};
...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM