【发布时间】:2012-04-22 22:32:40
【问题描述】:
我今天尝试了 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 并将其热交换到c.setText(String.valueOf(f-=1));,则直接应用更改,没有点击延迟。
我现在的问题是:究竟是什么导致了这种行为? f++ 和 f+=1 在 JVM 代码级别有什么区别?
【问题讨论】:
-
Precedence of ++ and -- operators in Java 的可能重复项......一般来说只是运算符。
-
我认为这是一个不同的问题,因为重点更多的是热插拔 JVM 的行为,而不是运算符优先级。