Java同一变量赋值的特殊性

看到一道java面试题,

http://www.iteye.com/topic/644423

public static void main(String[] args) {
int j = 0;
for(int i = 0; i < 100 ; i ++){
j = j++;
}
System.out.println(j);

}

很多人都会毫不犹豫说是100吧!告诉你,答案是0
 

这和JAVA的基本数据类型的运算有关,JAVA的基本数据类型都是值引用的,这跟对象不一样.同样,在你对基本数据类型进行操作后,他会生成在内存中划分出另外一块内存区.首先刚开始J = 0 , 在J = J++的时候, 等号前面的那个J已经不是J声名时的那块内存区了,JVM为他重

新为他分配一块新的内存区.比如说,int j = 0 时,j的内存地址为00xx01,值为0。那么经过第一循环的以后前面那个J内存地址为00xx02,值为0,而后面那个J(内存地址00xx01)则会进行++操作,此时他的值为1,不过他已经不能影响到前面J的值了,此时J的内存地址就已经是等号前面的那个J的内存地址了(00xx02),再进行第二循环的时候,j的内存地址是:00xx02,值是0,至于00xx01那块内存区域,因为已经没有人再使用,所以将会在下一次垃圾回收的时候被GC回收,此时他(内存地址为00xx02的J)变成后面的那个j,前面那个J 则又会重新分得一块新的内存区域00xx03,值仍然是0,而00xx02则又会被丢弃然后被GC回收,依此类推,直至最后打印时J仍然为0,但他的内存地址已经不是最开初的00xx01了,换句话说,他已经不是当初的那个J了。

注:分析中的内存地址为假设地址。

 

以上是作者的解释。这个解释我觉得是恰当的。很多人和JVM、内存没有关系,就是j++和++j的区别。但是如果亲自动手试过在C++和java运行的不同,就会认同这种解释。

在C++中运行,表明了++后缀的原本标准用法;但在java中,因为jvm的特殊机制,和这种经典用法有些差异。我亲自在C++中运行了下,结果不是0!而且在java中,如果把j=j++换成i=j++再输出j的值,j的值也不是0!这说明java在这个问题上的特殊性只在同名变量赋值时才有!

对这个问题的理解,我觉得类似String的不可变性的机理,在内部新建了一个变量。不过这个问题其实没有太大实际意义,因为直接写j++就可以了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章