❤ 面试题

1、自测结果(错误!)
i = 1 —> 2 —> 4
j = 3
k = 4 + 3*3 = 13
1.1、自测结果(知道 i 值后的自测)(正确!)
int i = 1 —> 2 —> 1 —> 2 —> 3 —> 4
int j = 1 **(重点**:需要注意 i++ 为用后加,删除-与结果无关!!!)
int k = 2 + 3*3 = 11
2、运行结果

一、面试题解析:i = i++
1、 执行过程
- ① 把 i 的值压入操作数栈
- ② i 变量自增1(重点:自增1是在局部变量表中进行的!)
- ③ 把操作数栈中的值赋值给 i(重点:赋值过程为操作数栈的值覆盖局部变量表中的值的过程???!!!)



2、字节码角度分析

3、细节说明:i = i++
- 同时在局部变量表和操作数栈中存在 i 。
- i++ 是在局部变量表中执行的!!!!
- 赋值操作会使得操作数栈的 i 值,覆盖局部变量表中的 i 值。(关键点:覆盖)
- 另外注意:i ++ 是用后加
二、面试题解析:int j = i++
1、 执行过程
- ① 把 i 的值压入操作数栈
- ② i 变量自增1
- ③ 把操作数栈中的值赋值给 j



2、字节码角度分析

三、面试题解析:int k = i + ++i * i++
1、 执行过程
- ① 把 i 的值压入操作数栈
- ② i 变量自增1
- ③ 把 i 的值压入操作数栈
- ④ 把 i 的值压入操作数栈
- ⑤ i 变量自增
- ⑥ 把操作数栈中前两个弹出求乘积结果再压入栈
- ⑦ 把操作数栈中的值弹出求和再赋值给 k







2、字节码角度分析

3、从字节码角度理解“i++ 与 ++i 的区别”
- 个人理解:iload(压入操作数栈)和 innc(局部变量表中自增)的先后顺序不同。
四、小结

五、拓展与思考
1、设 int i = 1,那么 int j = i++ 与 int j = ++i 有区别吗?(重点)
- 根据小结中“赋值 = 最后计算”,则两者没有区别???(**错误!**)
- 答案解析:前者是先压栈再自增(结果:1),后者是先自增再压栈(结果:2)
☀ 课堂小测
- 回答上述面试题。
- i = i++ 字节码和执行过程?细节说明?
- int j = i++ 字节码和执行过程?
- int k = i + ++i * i++ 字节码和执行过程?
- 自增变量的运算小结?
