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++就可以了。

 

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