1. 程式人生 > >再談Java物件:“=”的大坑

再談Java物件:“=”的大坑

開始之前,我們先來看一段程式碼:

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程式設計思想》