我今天尝试了Javas Hotswap,它的运行效果非常好。在测试期间,我偶然发现了一个相当奇怪的行为。这是我的代码:
public class Test extends JFrame implements ActionListener{
private JButton c;
private int f =1;
/**
* @param args
*/
public static void main(String[] args) {
Test t = new Test();
}
public Test(){
this.setPreferredSize(new Dimension(800, 600));
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
c = new JButton("Click");
c.addActionListener(this);
this.add(c);
this.pack();
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
c.setText(String.valueOf(f++));
}
}
注意结尾处的
c.setText(String.valueOf(f++));
线。如果在程序运行时将其切换为f--
,我会注意到在更改后第一次单击按钮时,该值仍在递增。不过,此后的点击数是正确的。将其改回时也会发生同样的情况。我注意到的下一件事是:如果我将代码更改为
c.setText(String.valueOf(f+=1));
,请运行JVM,然后将其Hotswap替换为c.setText(String.valueOf(f-=1));
,更改将直接应用,没有单击延迟。现在我的问题是:到底是什么导致了这种行为?在JVM代码级别上,
f++
和f+=1
有什么区别? 最佳答案
在此代码上使用javap:
public static void main(String[] args) throws Exception {
int i = 0;
i++;
System.out.println(i);
i+=1;
System.out.println(i);
}
退货
0: iconst_0
1: istore_1
2: iinc 1, 1
5: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
8: iload_1
9: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
12: iinc 1, 1
15: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
18: iload_1
19: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
22: return
==>没有区别