再談Java物件:“=”的大坑
阿新 • • 發佈:2018-12-21
開始之前,我們先來看一段程式碼:
class Tank{ int level; } public class assingment{ public static void main(String[] args) { Tank tank1 = new Tank(); Tank tank2 = new Tank(); t1.level = 9; t2.level = 20; t1 = t2;//a System.out.print(t1.level); //b System.out.print(t2.level);//c t1.level = 30;//d System.out.print(t1.level);//f System.out.print(t2.level);//g } }
請寫出bc和fg處的值:bc處簡單,都是20,那麼fg處呢?都是30!為什麼呢,請往下看
在a處,我們把t2的物件的引用給了t1,這時候t1和t2是同一個物件地址的“代理商”,都可以表示這個物件;在d處,我們通過t1這個代理商改變了真實引用的物件地址的值,由於t2的引用也是指向這個物件,t2.level的值是從這個物件地址裡面取的,而這個值已經由t1這個物件給改變了,所以t2.level = 30.
在往深層次一點的解釋,就是物件實體在堆中,物件引用在棧裡,通過物件的引用去操作在堆裡的真實物件實體。引用就像一根繩子,把你(的手)和氫氣球聯絡起來,氫氣球就是在堆裡的物件實體,你就是t1這個引用。原本t1、t2各有一個繩子,在a處,t1用了新繩子牽到了t2的氫氣球上面,這個時候t1和t2都可以操作這個氫氣球了。原來t1控制的那個氫氣球由於沒有繩子控制,意見飛走了(被jvm回收了。
所以說,“=”作用於兩個物件,是引用的改變。
ps:本文例子來自於《Java程式設計思想》