有时我们需要向匿名内部类传递参数,如,在监听类中我们常常使用匿名内部类,同时我们需要提供变量给该类作处理,那么应该怎么办呢?
一开始我以为,内部类使用局部函数中的变量也像使用外部类全局变量一样是可行的。但事实上,内部类只允许使用局部函数内定义为final的常量。
public class TestAnonymousInnerClass{
private JButton jb;
private JLabel jl;
private JFrame jf;
private JPanel jp;
private String outerString = "outer";
public static void main(String[] args) {
TestAnonymousInnerClass test = new TestAnonymousInnerClass();
test.fun();
}
public void fun() {
String innerString = "inner";
final String finalString = "final";
jl = new JLabel("this is nothing here");
jp = new JPanel();
jb = new JButton("Click Here");
jf = new JFrame();
jb.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
jl.setText(outerString); //可行
jl.setText(finalString); //可行
//jl.setText(innerString); //不可行
}
});
jp.add(jb);
jp.add(jl);
jf.add(jp);
jf.setBounds(100, 100, 400, 400);
jf.setVisible(true);
}
}
但是,我的目标是要显示是要显示innerString。于是我想到在构造函数中将innerString传递进去。但是却又发现匿名内部类的构造函数没法写啊!!!于是只能另谋他法了。后来想到,既然能将作为参数传到内部类中,那我为何不直接创建一个函数接收参数呢?于是,写了下面的代码作测试,成了。
jb.addActionListener(new ActionListener(){
private String innerStr;
@Override
public void actionPerformed(ActionEvent arg0) {
jl.setText(innerStr);
}
public ActionListener accept(String str) {
this.innerStr = str;
return this;
}
}.accept(innerString));
上述仅为本人在学习时的愚见,有更好方法,欢迎各位小伙伴们提出来,供大家参考学习。