[英]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.