java的傳值

java的傳值是一件非常令人迷惑的事情,尤其是對於長期從事C++編程的程序員而言。但他是java的基礎中的基礎,要能熟練掌握java必須瞭解java的內部傳值機制。以下是本人的一些愚見,望對大家有所幫助。

其實java的傳值十分簡單,因爲他只有一種傳值方式,即值傳遞。而針對傳值類型的不同傳值可分爲兩類:一是對基本數據類型(如:intdoublechar等),傳遞的即數據本身的值。二是對於object(對象),傳遞的是對象存儲的地址的值。接下來我來針對兩種情況分類舉例說明。

一、            對於基本數據類型

1public class TestPrimitive

{

       public static void main(String [] args)    

       {

              int i=10;

              boolean b=true;

              

              System.out.println ("Before test(): i="+i+"  b="+b);

              test(i,b);

              System.out.println ("After test(): i="+i+"  b="+b);

       }

       public static void test(int i,boolean b)

       {

              i=i+10;

              b=!b;

              System.out.println ("in test(): i="+i+"  b="+b);

       }

}

輸出結果爲:Before test(): i=10   b=true

After test(): i=10   b=true

函數test雖然改變了傳入變量的值。但是沒有改變源變量的值。即實際參數本身的沒有改變。test函數改變的只是本身作用域內的。這裏其實和C++中的機制相似。當程序調用test函數時,計算機其實在內存中另外申請了一個intboolean型的空間,並命名爲ib。(注:因爲作用域的關係,這裏的ib是指test函數中的ib)。然後將main中的ib的值傳進新申請的這兩個空間中。這就是爲什麼函數中的ib的值相互交換了,而main中的ib沒有換值。

二是對於object(對象)

    對於對象,在C++中是用傳引用的方法。而在java中所用的是傳值。傳的是什麼的值呢?傳的是對象所存儲的內存空間的地址。然後對地址進行引用,從而實現對對象內部的變量和方法進行調用。(就像用遙控機遙控電視一樣,這裏地址就是遙控機,而對象就是電視)。

2

public class TestReferencd

{

       private int i=100;

       public static void main(String [] args)

       {

              TestReferencd t=new TestReferencd();

              System.out.println ("Before test(): t="+t+"  t.i="+t.i);

              test(t);

              System.out.println ("After test(): t="+t+"  t.i="+t.i);

       }

       public static void test(TestReferencd o)

       {

              o.i=0;

              System.out.println ("In test():o="+o+"  o.i="+o.i);

       }

}

結果:

Before test(): t=TestReferencd@35ce36  t.i=100

In test(): o=TestReferencd@35ce36  o.i=0

After test(): t=TestReferencd@35ce36  t.i=0

注:TestReferencd@35ce36是對象t的存儲空間的地址,不同的計算機中存儲空間的地址不同,因此得到的值也不同。

當函數test被調用是,計算機也申請了一個新的空間,只是這個空間並沒有存儲任何變量的值,而是存儲了對象t的空間地址,即TestReferencd@35ce36。當執行到o.i=0;語句時,程序根據o中存儲的地址(即TestReferencd@35ce36)訪問空間中存儲的變量j,並對其進行賦值。其實這裏的j就是對象t中的值,因此當我們再次調用t.j時會發現t.j的值被改變了。

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