java a >2_JAVA基础2---深度解析A++和++A的区别

我们都知道JAVA中A++和++A在用法上的区别,都是自增,A++是先取值再自增,++A是先自增再取值,那么为什么会是这样的呢?

1.关于A++和++A的区别,下面的来看个例子:

1 public classPlusPlusDemo {2 public static voidmain(String[] args) {3 test();4 }5

6 public static voidtest() {7 int a = 10;8 System.out.println(a++);//结果为10,但是a的值最终为11

9 System.out.println(++a);//结果为12,a的值最终为12

10 }11 }

虽然现在我们知道a++是先取值再自增,而++a是先自增再取值,那么它是怎么实现的呢,接下来我们来看下这段代码被JVM编译之后的字节码,如下:

1 public classcom.luck.codehelp.test.exception.PlusPlusDemo {2 publiccom.luck.codehelp.test.exception.PlusPlusDemo();3 Code:4 0: aload_05 1: invokespecial #8 //Method java/lang/Object."":()V

6 4: return

7

8 public static voidmain(java.lang.String[]);9 Code:10 0: invokestatic #16 //Method test:()V

11 3: return

12

13 public static voidtest();14 Code:15 0: bipush 10

16 2: istore_017 3: getstatic #21 //Field java/lang/System.out:Ljava/io/PrintStream;

18 6: iload_019 7: iinc 0, 1

20 10: invokevirtual #27 //Method java/io/PrintStream.println:(I)V

21 13: getstatic #21 //Field java/lang/System.out:Ljava/io/PrintStream;

22 16: iinc 0, 1

23 19: iload_024 20: invokevirtual #27 //Method java/io/PrintStream.println:(I)V

25 23: return

26 }

其中从13行到25行是关于test方法的编译结果,现在来依行分析:

1.bipush 指令:将常量10加载到操作数----------------------------------------------------------------------------->>>局部变量表:空                 操作数栈:10

2.istore_0:将操作数栈中的数值10加载到局部变量表中的第0位的变量a --------------------------------->>>局部变量表:a=10            操作数栈:空

3.getstatic:操作System类的静态字段out

4.iload_0:将局部变量表中的第0位的变量a的值加载到操作数栈中 ----------------------------------------->>>局部变量表:a=10            操作数栈:10

5.iinc 0,1:局部变量表中的第0位的变量a执行自增操作---------------------------------------------------------->>>局部变量表:a=11            操作数栈:10

6.invokevirtual:执行println()方法,从操作数栈获取到的值为10,打印结果为10------------------------->>>局部变量表:a=11            操作数栈:空

7.getstatic:操作System类的静态字段out

8.iinc 0,1:局部变量表中的第0位的变量a执行自增操作---------------------------------------------------------->>>局部变量表:a=12            操作数栈:空

9.iload_0:将局部变量表中的第0位的变量a加载到操作数------------------------------------------------------->>>局部变量表:a=12            操作数栈:12

10.invokevirtual:执行println()方法,从操作数栈获取到的值为12,打印结果为12------------------------>>>局部变量表:a=12            操作数栈:空

自减和自增的原理一样,有兴趣的同学可以自行研究下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值