我今天正在教授一门入门编程课程,并且正在学习一些涉及 Java 变量赋值的简单代码。代码的重点不是炫耀任何特别令人兴奋的东西,而是主要是为了确保学生理解变量赋值语句。
我在板上有以下方法,一次一行地跟踪它:
private void simpleMethod() {
int myInt = 137;
myInt = 42;
myInt = myInt + 1;
/* ... code using myInt ... */
}
一个学生问我myInt
在程序运行时是否真的会保存值 137 和 42,或者它是否会直接跳转到保存 43。我告诉学生代码将依次执行每一行,所以变量实际上会保存这些中间值。
不过,老实说,我不确定字节码javac
会发出什么(完全忽略了 JVM 所做的优化)。(或任何 Java 编译器)是否javac
合法允许优化愚蠢的赋值语句,而直接初始化myInt
为 43?
根据javap
,在我的系统上,上面用编译的代码javac
产生
0: sipush 137
3: istore_1
4: bipush 42
6: istore_1
7: iload_1
8: iconst_1
9: iadd
10: istore_1
11: return
所以这里没有优化。不过,我的问题是优化这个是否合法,所以这并不能解决任何问题。