public class Test{ public static void main(String[] args){ int i=0; int a=i++; System.out.println(i); System.out.println(a); } } 對於上述代碼,發現一個朋友在討論這個問題,今天仔細研究了一下,發現其中的問題仍是不少的。 1.執行javap -c Test E:\第二階段練習文件\js\test>javap -c Test Compiled from "Test.java" public class Test extends java.lang.Object{ public Test(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: iconst_0 1: istore_1 2: iload_1 3: iinc 1, 1 6: istore_2 7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 10: iload_1 11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 14: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 17: iload_2 18: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 21: return } 這是執行的結果,仔細研究這個反編譯過程,並查找了一些資料,以爲應該是解決了這個問題。 2.談談體會: 開始的時候在棧中放入0,爲i的引用。 而後計算i++,很明顯,a的值爲1,而後i爲2. 固然這個誰都知道,那i=i++呢?若是是這個問題,就比較複雜了,可是想通了以後,你就知道我爲何要寫上述的程序了。 來看看i=i++的程序: public class Test{ public static void main(String[] args){ int i=0; i=i++; System.out.println(i); } } 執行反編譯的結果: E:\第二階段練習文件\js\test>javap -c Test Compiled from "Test.java" public class Test extends java.lang.Object{ public Test(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: iconst_0 1: istore_1 2: iload_1 3: iinc 1, 1 6: istore_1 7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 10: iload_1 11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 14: return } 結果是: 0 爲何呢? 首先,在棧中放入0 而後,將i=i++中的i++計算,可知,要將i=0這個值賦給 i=i++ 中的前面的那個i,這就是java會給i分配一個新的虛擬空間來保存這個數據,而當後面的那個i計算爲1以後,這個表達式就執行完畢,可是,此時,高潮來了。 前面的那個i中的值將會從棧中被取出並覆蓋了後面的那個i,由於這裏只許擁有一個i變量,後面的那個i原本是1,可是它的值在棧中被先取出來了,因此是開始爲1,最後爲0(這個0是由前面那個i放進去的)