inside JButton's actionperformed final variables required?
所以我有一个
1 2 3 4 5 6 | public SomeClass() { btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { list.clearSelection(); }}); } |
实际上,我在最终决定时没有问题,我只是不知道为什么我需要。
要回答您的问题,您需要了解一些基本知识,比如JVM如何工作。当编译包含内部类的类时,生成的字节代码实际上并不将内部类作为类内的类来实现。
错误原因:局部变量是从内部类访问的,需要声明为final
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JMenu; import javax.swing.JPanel; public class foo extends JPanel { public foo() { final JMenu edit = new JMenu(); edit.getItem(0).addMouseListener(new MouseAdapter(){ @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 1) { edit.getItem(0).setEnabled(true); } } }); } } |
编译这个程序时,将创建两个文件:foo.class和foo$1.class。所以现在你的问题来了,因为
那么如何解决这个问题呢?
现在这样做了,现在JVM悄悄地将一个名为val$edit的隐藏变量放在第二个编译类文件中,这里是从
输出用于foo.class
1 2 3 4 5 | C:\Mine\JAVA\J2SE\folder>javap foo.class Compiled from"foo.java" public class foo extends javax.swing.JPanel { public foo(); } |
现在,由于edit是构造函数本地的,因此输出如上所述。
1 2 3 4 5 6 7 8 | C:\Mine\JAVA\J2SE\folder>javap foo$1.class Compiled from"foo.java" class foo$1 extends java.awt.event.MouseAdapter { final javax.swing.JMenu val$edit; final foo this$0; foo$1(foo, javax.swing.JMenu); public void mouseClicked(java.awt.event.MouseEvent); } |
现在,如果我把editKBD
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JMenu; import javax.swing.JPanel; public class foo extends JPanel { JMenu edit = new JMenu(); public foo() { edit.getItem(0).addMouseListener(new MouseAdapter(){ @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 1) { edit.getItem(0).setEnabled(true); } } }); } } |
在这种情况下,我们不应该将其声明和定义为
1 2 3 4 5 6 |
以下是在这种情况下发送
1 2 3 4 5 6 7 | C:\Mine\JAVA\J2SE\folder>javap foo$1.class Compiled from"foo.java" class foo$1 extends java.awt.event.MouseAdapter { final foo this$0; foo$1(foo); public void mouseClicked(java.awt.event.MouseEvent); } |
据我看来,这就是解释,这种情况是如何运作的。刚才我在互联网上发现了这个关于当地内部阶级可接近性的神秘解释,也许这能帮助你更好地理解这种情况:—)
通过将
您正在创建一个匿名类,并且
有关更多信息,请参阅本文