Java中傳值和傳引用的區別
宣告:此文是作為本人自己學習的心得與總結,同時也是與同學們進行交流,如果有錯誤的地方,希望同學們進行指正。
在這裡,要想搞清楚二者的區別,那麼首先明白兩個概念,“傳值”、“傳引用”。
1、傳值:傳值就是指將一個值傳遞到方法的內部。例如int a = 5,那麼也就是給int型變數a賦值,值為5.如果一個方法,將這個變數傳進方法的內部,則進行的就是傳值。在java中,有8種基本資料型別,它們分別為:int、long、float、double、char、boolean、short、byte.這8種基本的資料型別作為引數進行傳遞是,都是進行的傳值。·除此之外,還有一種特殊的情況,String。本身String是一個引用型別,很多人認為在向方法中傳遞String型別引數時,是進行傳引用。其實在這裡,String可以看做為一個包裝類,因為String其本身就是通過字元陣列實現的,那麼它在實現引數傳遞的時候,也就是以char型資料的方式進行的,也就是進行傳值。
2、傳引用:java中的引用可以初步的理解為地址。也是在new了一個物件後,該物件是存在JVM的Heap區,也就是堆。那麼必然有一個地址要指向這個物件的在JVM中的位置,那麼,指向這個物件的這個地址就可以簡單的理解為“引用”。
那麼,上面簡單的敘述了一下“傳值”和“傳引用”這倆個概念。再簡單的總結下就是,如果是向方法中傳遞值,也就是傳值,那麼實際就是拷貝一份資料,在方法內部進行操作。而傳引用則是將一個物件的地址傳遞至方法內部。
書歸正傳,二者到底有什麼區別呢?個人理解有如下幾個區別:
一、“傳值”傳遞的是一個值,而“傳引用”傳遞的是指向一個另一塊記憶體空間的地址;
二、“傳值”實際是將一個值的拷貝傳遞至方法內部,這個值的原始資料是不會改變的,無論你內部進行的是何種操作,都不會改變這個源資料的值;而“傳引用”傳遞進去的則是指向一個物件的地址,那麼在方法內部進行實際操作的時候,就很可能會改變該物件的屬性值(當然具體是否改變,還需要結合具體的業務)。
以上就是我理解的“傳值”和“傳引用”二者之間的區別。
在這裡引出另外一個問題,在java中到底是隻存在“傳值”呢?還是既存在“傳值”又存在“傳引用”呢?在網上,就分成了兩種意見。我認為,這只是一個角度的問題。怎麼理解呢?學過彙編的同學都知道,在記憶體當中,無論是資料,還是程式碼 其本質都是二進位制資料,到底是資料呢?還是程式碼呢?這只是將這些二進位制資料根據其作用分為不同的倆類來加以區分。同樣的道理,到底是值呢,還是引用呢?從本質上來講,引用(這裡簡單的理解為地址)它說白了也就是一個值。那麼認為只有“傳值”這一種方式的同學,則是從一個更本質的角度來看待這個問題。那麼,認為是兩種方式的同學們也是沒有問題的。因為的確二者傳遞至方法內部後,操作的物件是不同的,“傳值”是對傳進來的值,也就是8種基本資料型別外加String類進行操作,而“傳引用”這是對傳進來的地址指向的物件進行操作,當然也可以對傳進來的“引用”進行操作。
以上就是我對這個問題的分析和理解,如果有不對的地方,或者誤導大家的地方,歡迎大家指出來,讓我們共同進步!