Java中的參數傳遞詳細介紹
前言
Java中的參數傳遞:分為值傳遞和引用傳遞
但本質上,Java中隻有值傳遞。引用傳遞,其實可以理解為傳的是類似指針的東西。
值傳遞就是把基本變量的值拷貝一份,傳遞這個拷貝。引用傳遞則是傳遞的引用的地址,也就是該變量在內存空間的地址。
1.值傳遞
隻有基本數據類型采用值傳遞,特點是傳遞的是值的拷貝,傳遞完後兩者就沒有關系瞭。也就是說方法內和方法外的值互不相幹
基本數據類型:
·整型:int,long,byte,short
浮點型:float,double
字符型:char
佈爾型:boolean
註:8種基本數據類型以外的數據類型都為引用類型。
2.引用傳遞
指的是在方法調用時,傳遞的參數是按引用進行傳遞,其實傳遞的引用的地址,也就是變量所對應的內存空間的地址。
傳遞的是一個拷貝,即副本。也就是說,對於一個參數傳遞,存在兩個地址指向同一個內存空間。這裡我們可以用內存分配示意圖來體現
3.String類型傳遞
先說結論,String類型傳遞與基本數據類型的傳遞效果相似。
說明:
String類對象一旦創建,其內容不可更改:
String類的所有方法都不會改變String類對象內容,要改變String類對象的值就必須創建一個新的String對象。
也就是說,當進行參數傳遞時,如果方法內對String類對象的值進行瞭修改,那麼實際上是創建瞭一個新的String類對象,然後讓原來的變量指向它而已。但是這個“原來的變量”是一份拷貝副本,隻是一開始創建的時候與主方法中的傳遞的值相同而已,現在改變之後,兩者就毫無關系瞭。
4.舉例
1)代碼
public class TestTransOfValue {public static void main(String args[]) { double val; StringBuffer sb1, sb2; String sb3; char s[]={'a','p','p','l','e'}; val = 5.8; sb1 = new StringBuffer("apples"); sb2=new StringBuffer("pears"); sb3 = new String("pear"); modify(val, sb1, sb2,sb3,s); System.out.println(val); System.out.println(sb1); System.out.println(sb2); System.out.println(sb3); System.out.println(s); } public static void modify(double a, StringBuffer r1, StringBuffer r2,String r3,char s[] ) { a = 6.8; r1.append(" taste good"); r2=null; r3="banana"; s[2]='R'; } }
2)運行結果
5.8
apples taste good
pears
pear
apRle
3)解釋:
①val是基本數據類型,值拷貝的兩者直接互不影響。所以modify方法內對a的操作不影響主方法的val的值 因此val=5.8
②sb1為StringBuffer型,不屬於基本類型,因此是引用傳遞。r1.append()修改瞭r1地址對應的內存空間的值,因此sb1的值改變瞭
③sb2同樣是StringBuffer型,屬於引用傳遞。但r2=null是修改的r2的地址的值而不是r2地址指向的內存空間的值,因此sb2指向的還是原來指向的內存空間,且內存空間的值未被改變。
④sb3為String類型,屬於引用傳遞。但是String類型是一個特殊的類,在方法內改變String的值並不能改變主方法中的String的值,因此String仍然是pear
⑤char數組為引用傳遞,且s[2]=‘R’,確實修改的是內存空間的值,因此char數組的值被改變
總結
到此這篇關於Java中的參數傳遞詳解的文章就介紹到這瞭,更多相關Java參數傳遞內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 詳解Java中String,StringBuffer和StringBuilder的使用
- Java基礎入門語法–String類
- Java有哪些操作字符串的類?區別在哪?
- Java String類字符串的理解與認知
- Java-String類最全匯總(上篇)