日期:2014-05-20  浏览次数:20769 次

大侠们,帮我深思下,++i和i++的区别
i++:先引用后增加
++i:先增加后引用 

这两句话是通过什么来证明的,感激不尽,
我还想问下,
++i
i++
分别创建了几个对象,大侠们,真正懂的帮我解答下,一瓶子不满半瓶子咣当(像我似的)都来学习学习吧。
在创建对象上有什么疑问的地方,大家一起提出来,大家一起解决解决,java初学者,对创建对象, 和对象的引用确实搞不太清
如果在创建对象的时,!!!!是在堆中创建一个实例地址,然后指向一个队列中,在队列中创建的引用吗????
感谢了!~~
真有愿意帮忙的加小弟QQ感激不尽。
小弟分少想多提些问题,见谅了!!

------解决方案--------------------
1.这两句话是通过什么来证明的
执行javap 看字节码

java的表达式求职是从左向右的顺序,这个没有异议吧。
++是对变量执行+1操作,这个也没有异议吧。
JVM中的指令大多是零地址指令,是一个基于栈架构的指令系统。解释器解释指令时最多的操作就是出栈,入栈;

看这句:int j = i++;
=号优先级比++低,先执行i++:
先将变量i的值压入栈,然后看到++了,就对变量i执行加1的操作(这里是直接对变量i加1,不是对压入栈的值加1)。然后执行=,就是把栈顶值赋值给j。栈顶值是什么?i原来的值,加1了吗?没有。

再看这句:int j = ++i;
=号优先级比++低,先执行++i:
先看到++了,对变量i执行加1的操作,然后是把变量i的值压入栈(前一步已经加1了,这时压入栈的是加过1后的值。)然后执行=,就是把栈顶值赋值给j。栈顶值是什么?加过1后的值,加1了吗?加了。

现在明白i++和++i了吗?

---------------------------------
2.“分别创建了几个对象”
如果i是一个局部变量,那么i在执行这段代码的时候只是在栈上存在(局部变量表保存这个i(上面说的“直接对变量i加1”,就是操作这个i);操作数栈(上说的“把i的值压入栈”,就是往操作数栈压) )。所以一般不把这个i称作是“对象”
如果i是一个实例变量,也就是 private int i,这样的。你在创建一个改类的对象的时候,在堆内存中会有给这个类的的对象分配一块内存空间,这块内存空间里有这个i的一席之地。
如果i是一个类变量。也就是 private static i,这样的。这个i是属于类的一部分,也就是在虚拟机加载这个类的时候会创建这个类的一个class对象,这个i是属于他的一部分。所有该类的对象共享一份。

最后:int类型的值如果超出short表示范围也就是两个字节的时候是放入常量池的,否则由变量直接保存。