我是第一次使用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方法是静态的吗?
答案 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。