Java中的參數(shù)傳遞詳細介紹
前言
Java中的參數(shù)傳遞:分為值傳遞和引用傳遞
但本質(zhì)上,Java中只有值傳遞。引用傳遞,其實可以理解為傳的是類似指針的東西。
值傳遞就是把基本變量的值拷貝一份,傳遞這個拷貝。引用傳遞則是傳遞的引用的地址,也就是該變量在內(nèi)存空間的地址。
1.值傳遞
只有基本數(shù)據(jù)類型采用值傳遞,特點是傳遞的是值的拷貝,傳遞完后兩者就沒有關(guān)系了。也就是說方法內(nèi)和方法外的值互不相干
基本數(shù)據(jù)類型:
·整型:int,long,byte,short
浮點型:float,double
字符型:char
布爾型:boolean
注:8種基本數(shù)據(jù)類型以外的數(shù)據(jù)類型都為引用類型。
2.引用傳遞
指的是在方法調(diào)用時,傳遞的參數(shù)是按引用進行傳遞,其實傳遞的引用的地址,也就是變量所對應(yīng)的內(nèi)存空間的地址。
傳遞的是一個拷貝,即副本。也就是說,對于一個參數(shù)傳遞,存在兩個地址指向同一個內(nèi)存空間。這里我們可以用內(nèi)存分配示意圖來體現(xiàn)
3.String類型傳遞
先說結(jié)論,String類型傳遞與基本數(shù)據(jù)類型的傳遞效果相似。
說明:
String類對象一旦創(chuàng)建,其內(nèi)容不可更改:
String類的所有方法都不會改變String類對象內(nèi)容,要改變String類對象的值就必須創(chuàng)建一個新的String對象。
也就是說,當(dāng)進行參數(shù)傳遞時,如果方法內(nèi)對String類對象的值進行了修改,那么實際上是創(chuàng)建了一個新的String類對象,然后讓原來的變量指向它而已。但是這個“原來的變量”是一份拷貝副本,只是一開始創(chuàng)建的時候與主方法中的傳遞的值相同而已,現(xiàn)在改變之后,兩者就毫無關(guān)系了。
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)運行結(jié)果
5.8
apples taste good
pears
pear
apRle
3)解釋:
①val是基本數(shù)據(jù)類型,值拷貝的兩者直接互不影響。所以modify方法內(nèi)對a的操作不影響主方法的val的值 因此val=5.8
②sb1為StringBuffer型,不屬于基本類型,因此是引用傳遞。r1.append()修改了r1地址對應(yīng)的內(nèi)存空間的值,因此sb1的值改變了
③sb2同樣是StringBuffer型,屬于引用傳遞。但r2=null是修改的r2的地址的值而不是r2地址指向的內(nèi)存空間的值,因此sb2指向的還是原來指向的內(nèi)存空間,且內(nèi)存空間的值未被改變。
④sb3為String類型,屬于引用傳遞。但是String類型是一個特殊的類,在方法內(nèi)改變String的值并不能改變主方法中的String的值,因此String仍然是pear
⑤char數(shù)組為引用傳遞,且s[2]=‘R’,確實修改的是內(nèi)存空間的值,因此char數(shù)組的值被改變
總結(jié)
到此這篇關(guān)于Java中的參數(shù)傳遞詳解的文章就介紹到這了,更多相關(guān)Java參數(shù)傳遞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java通過MySQL驅(qū)動攔截器實現(xiàn)執(zhí)行sql耗時計算
本文主要介紹了java通過MySQL驅(qū)動攔截器實現(xiàn)執(zhí)行sql耗時計算,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Java虛擬機調(diào)用Java主類的main()方法
這篇文章主要介紹了Java虛擬機調(diào)用Java主類的main()方法,前一篇文章我們介紹了關(guān)于Java虛擬機HotSpot2021-11-11解析Spring Boot內(nèi)嵌tomcat關(guān)于getServletContext().getRealPath獲取得到臨時
大家都很糾結(jié)這個問題在使用getServletContext().getRealPath()得到的是臨時文件的路徑,每次重啟服務(wù),這個臨時文件的路徑還好變更,下面小編通過本文給大家分享Spring Boot內(nèi)嵌tomcat關(guān)于getServletContext().getRealPath獲取得到臨時路徑的問題,一起看看吧2021-05-05關(guān)于Java中byte[]?和?String互相轉(zhuǎn)換問題
這篇文章主要介紹了Java中byte[]?和?String互相轉(zhuǎn)換問題,通過用例給大家介紹了通過String類將String轉(zhuǎn)換成byte[]或者byte[]轉(zhuǎn)換成String,具體實例代碼跟隨小編一起看看吧2022-01-01Java設(shè)計模式之策略模式_動力節(jié)點Java學(xué)院整理
策略模式是對算法的封裝,把一系列的算法分別封裝到對應(yīng)的類中,并且這些類實現(xiàn)相同的接口,相互之間可以替換。接下來通過本文給大家分享Java設(shè)計模式之策略模式,感興趣的朋友一起看看吧2017-08-08