日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面试再问值传递与引用传递,把这篇文章砸给他!

發(fā)布時(shí)間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试再问值传递与引用传递,把这篇文章砸给他! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java的值傳遞和引用傳遞在面試中一般都會(huì)都被涉及到,今天我們就來聊聊這個(gè)問題,首先我們必須認(rèn)識(shí)到這個(gè)問題一般是相對函數(shù)而言的,也就是java中的方法參數(shù),那么我們先來回顧一下在程序設(shè)計(jì)語言中有關(guān)參數(shù)傳遞給方法(或函數(shù))的兩個(gè)專業(yè)術(shù)語:

  • 按值調(diào)用(call by value)

  • 按引用調(diào)用(call by reference)

所謂的按值調(diào)用表示方法接收的是調(diào)用者提供的值,而按引用調(diào)用則表示方法接收的是調(diào)用者提供的變量地址(如果是C語言的話來說就是指針啦,當(dāng)然java并沒有指針的概念)。

這里我們需要注意的是一個(gè)方法可以修改傳遞引用所對應(yīng)的變量值,而不能修改傳遞值調(diào)用所對應(yīng)的變量值,這句話相當(dāng)重要,這是按值調(diào)用與引用調(diào)用的根本區(qū)別,當(dāng)然如果還不理解,沒關(guān)系,下面就要圖文并茂的徹底分析啦。

前面我們說過java中并不存在引用調(diào)用,這點(diǎn)是沒錯(cuò)的,因?yàn)閖ava程序設(shè)計(jì)語言確實(shí)是采用了按值調(diào)用,即call by value。也就是說方法得到的是所有參數(shù)值的一個(gè)拷貝,方法并不能修改傳遞給它的任何參數(shù)變量的內(nèi)容。下面我們來看一個(gè)例子:

package?com.zejian.test; /***?java中的按值調(diào)用*?@author?zejian*/ public?class?CallByValue?{private?static?int?x=10;public?static?void?updateValue(int?value){value?=?3?*?value;}public?static?void?main(String[]?args)?{System.out.println("調(diào)用前x的值:"+x);updateValue(x);System.out.println("調(diào)用后x的值:"+x);}}

?運(yùn)行程序,結(jié)果如下:

調(diào)用前x的值:10 調(diào)用后x的值:10

可以看到x的值并沒有變化,接下來我們一起來看一下具體的執(zhí)行過程:

分析:

1)value被初始化為x值的一個(gè)拷貝(也就是10)

2)value被乘以3后等于30,但注意此時(shí)x的值仍為10!

3)這個(gè)方法結(jié)束后,參數(shù)變量value不再使用,被回收。

?

結(jié)論:

當(dāng)傳遞方法參數(shù)類型為基本數(shù)據(jù)類型(數(shù)字以及布爾值)時(shí),一個(gè)方法是不可能修改一個(gè)基本數(shù)據(jù)類型的參數(shù)。

當(dāng)然java中除了基本數(shù)據(jù)類型還有引用數(shù)據(jù)類型,也就是對象引用,那么對于這種數(shù)據(jù)類型又是怎么樣的情況呢?

我們還是一樣先來看一個(gè)例子:

聲明一個(gè)User對象類型:

package?com.zejian.test; public?class?User?{private?String?name;private?int?age;public?User(String?name,?int?age)?{this.name=name;this.age=age;}public?String?getName()?{return?name;}public?void?setName(String?name)?{this.name?=?name;}public?int?getAge()?{return?age;}public?void?setAge(int?age)?{this.age?=?age;}}

執(zhí)行類如下:

package?com.zejian.test; /***?java中的按值調(diào)用*?@author?zejian*/ public?class?CallByValue?{private?static?User?user = null;public?static?void?updateUser(User?student){student.setName("ZL");student.setAge(18);}public?static?void?main(String[]?args)?{user?=?new?User("zhangsan",26);System.out.println("調(diào)用前user的值:"+user.toString());updateUser(user);System.out.println("調(diào)用后user的值:"+user.toString());} }

.?運(yùn)行結(jié)果如下:

調(diào)用前user的值:User?[name=zhangsan,?age=26] 調(diào)用后user的值:User?[name=ZL,?age=18]

很顯然,User的值被改變了,也就是說方法參數(shù)類型如果是引用類型的話,引用類型對應(yīng)的值將會(huì)被修改,下面我們來分析一下這個(gè)過程:

過程分析:

1)student變量被初始化為user值的拷貝,這里是一個(gè)對象的引用。

2)調(diào)用student變量的set方法作用在這個(gè)引用對象上,user和student同時(shí)引用的User對象內(nèi)部值被修改。

3)方法結(jié)束后,student變量不再使用,被釋放,而user還是沒有變,依然指向User對象。

結(jié)論:

當(dāng)傳遞方法參數(shù)類型為引用數(shù)據(jù)類型時(shí),一個(gè)方法將修改一個(gè)引用數(shù)據(jù)類型的參數(shù)所指向?qū)ο蟮闹怠?/p>

雖然到這里兩個(gè)數(shù)據(jù)類型的傳遞都分析完了,也明白的基本數(shù)據(jù)類型的傳遞和引用數(shù)據(jù)類型的傳遞區(qū)別,前者將不會(huì)修改原數(shù)據(jù)的值,而后者將會(huì)修改引用所指向?qū)ο蟮闹怠?/p>

可通過上面的實(shí)例我們可能就會(huì)覺得java同時(shí)擁有按值調(diào)用和按引用調(diào)用啊,可惜的是這樣的理解是有誤導(dǎo)性的,雖然上面引用傳遞表面上體現(xiàn)了按引用調(diào)用現(xiàn)象,但是java中確實(shí)只有按值調(diào)用而沒有按引用調(diào)用。

到這里估計(jì)不少人都蒙逼了,下面我們通過一個(gè)反例來說明(回憶一下開頭我們所說明的按值調(diào)用與按引用調(diào)用的根本區(qū)別)。

package?com.zejian.test; /***?java中的按值調(diào)用*?@author?zejian*/ public?class?CallByValue?{private?static?User?user=null;private?static?User?stu=null;/***?交換兩個(gè)對象*?@param?x*?@param?y*/public?static?void?swap(User?x,User?y){User?temp?=x;x=y;y=temp;}public?static?void?main(String[]?args)?{user?=?new?User("user",26);stu?=?new?User("stu",18);System.out.println("調(diào)用前user的值:"+user.toString());System.out.println("調(diào)用前stu的值:"+stu.toString());swap(user,stu);System.out.println("調(diào)用后user的值:"+user.toString());System.out.println("調(diào)用后stu的值:"+stu.toString());} }

我們通過一個(gè)swap函數(shù)來交換兩個(gè)變量user和stu的值,在前面我們說過,如果是按引用調(diào)用那么一個(gè)方法可以修改傳遞引用所對應(yīng)的變量值,也就是說如果java是按引用調(diào)用的話,那么swap方法將能夠?qū)崿F(xiàn)數(shù)據(jù)的交換,而實(shí)際運(yùn)行結(jié)果是:

調(diào)用前user的值:User?[name=user,?age=26]調(diào)用前stu的值:User?[name=stu,?age=18]調(diào)用后user的值:User?[name=user,?age=26]調(diào)用后stu的值:User?[name=stu,?age=18]

我們發(fā)現(xiàn)user和stu的值并沒有發(fā)生變化,也就是方法swap并沒有改變存儲(chǔ)在變量user和stu中的對象引用。swap方法的參數(shù)x和y被初始化為兩個(gè)對象引用的拷貝,這個(gè)方法交換的是這兩個(gè)拷貝的值而已,最終,所做的事都是白費(fèi)力氣罷了。在方法結(jié)束后x,y將被丟棄,而原來的變量user和stu仍然引用這個(gè)方法調(diào)用之前所引用的對象。

這個(gè)過程也充分說明了java程序設(shè)計(jì)語言對對象采用的不是引用調(diào)用,實(shí)際上是對象引用進(jìn)行的是值傳遞,當(dāng)然在這里我們可以簡單理解為這就是按值調(diào)用和引用調(diào)用的區(qū)別,而且必須明白即使java函數(shù)在傳遞引用數(shù)據(jù)類型時(shí),也只是拷貝了引用的值罷了,之所以能修改引用數(shù)據(jù)是因?yàn)樗鼈兺瑫r(shí)指向了一個(gè)對象,但這仍然是按值調(diào)用而不是引用調(diào)用。

總結(jié):

  • 一個(gè)方法不能修改一個(gè)基本數(shù)據(jù)類型的參數(shù)(數(shù)值型和布爾型)。

  • 一個(gè)方法可以修改一個(gè)引用所指向的對象狀態(tài),但這仍然是按值調(diào)用而非引用調(diào)用。

  • 上面兩種傳遞都進(jìn)行了值拷貝的過程。

  • 總結(jié)

    以上是生活随笔為你收集整理的面试再问值传递与引用传递,把这篇文章砸给他!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。