博主最近刷java题时,遇见很多匪夷所思的问题,常常被答案搞得糊里糊涂,相信很多新手也都遇到过类似的问题,比如下面这题:
int i =0;
i = i++;
System.out.print(i);- 1
- 2
- 3
最后输出0,各家说法,千奇百怪。
这时候我们就需要一个权威的答案,最好就是从本质入手,我们看下这段代码核心的汇编命令:
0: iconst_0
1: istore_1
2: iload_1
3: iinc 1, 1
6: istore_1
10: iload_1- 1
- 2
- 3
- 4
- 5
- 6
翻译成人话:
0:0入操作栈顶(0)
1:将操作数栈顶(0)的整型值存放到局部变量表第一个Slot中(0)
2:将局部变量表第一个Slot中的整型值(0)复制到操作数栈顶(0)
3:局部变量表第一个Slot中的整型值+1(1)
6:将操作数栈顶的整型值(0)存放到局部变量表第一个Slot中(0)
10:将局部变量表第一个Slot中的整型值(0)复制到操作数栈顶(0)- 1
- 2
- 3
- 4
- 5
- 6
很明显,一番折腾后最后答案是0。
从上面我们可以看出javap命令可以让我们透过现象看本质,还不会用javap命令的同学继续往下看,下面讲讲Eclipse中配置javap命令的教程:
1、点击菜单栏 Run –> External tools –> External tools Configurations

在Program上New一个新配置项。
2、输入参数:
Name: javap
Locations: 选择jdk的javap.exe文件所在的位置
Working Directory: workspaceloc/workspaceloc/{project_name}
Arguments: -classpath bin -c ${java_type_name}

说明:
${workspace_loc}表示工作空间所在的路径;
${project_name}表示项目的名称;
${java_type_name}表示所选java文件的类名(全名);
3、点击Run
这时,通常会报错:

这是因为,我们没有选中任何Java文件。
下面让我们操练起来:

结果:

<终>
本文解析了Java中i=i++导致输出0的谜题,通过javap命令揭示了背后的字节码指令,详细解释了操作数栈与局部变量表的工作原理。并提供了在Eclipse中配置与使用javap命令的教程。
6366

被折叠的 条评论
为什么被折叠?



