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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

用画小狗的方法来解释Java中的值传递

發布時間:2023/12/4 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用画小狗的方法来解释Java中的值传递 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


在開始看我畫小狗之前,咱們先來看道很簡單的題目:

?
下面程序的輸出是什么?



如果你的回答是“小強”,好,恭喜你答對了。下面我們改一下代碼:



是的,我只是在changeName方法里面加了一句代碼



這一次的輸出又是什么呢?

A、旺財?

B、小強


答案是A、旺財,changeName方法并沒有把myDog的名稱改了。如果你答錯了,沒關系,我要開始畫小狗了,畫完你就明白了;如果你答對了,但不太明白其中的原因,那我畫的小狗也肯定能幫到你。


myDog是什么


首先你要搞懂,代碼里的變量myDog是什么?myDog真的就是一只狗嗎?不!不是!myDog只是一條遛狗用的狗繩!



換句話說說,myDog并不是new出來的放在堆中的對象(object)!myDog只是一個指向這個對象實例的引用(reference)!


如果你對Java的運行時數據區域足夠了解,應該知道,這個引用是放在虛擬機棧上的。


參數傳遞


現在你知道了,myDog只是一條繩子,但這似乎并不能解釋為什么changeName方法沒有把myDog的名稱改為“小強”,因為按照現有的理解,dog = new Dog(),就是把我的狗繩綁到另一只小狗身上,然后給這只小狗起名為“小強”,就像這樣:



可事實是,myDog還是叫旺財,這是為什么??


問題就出在方法調用上。


當我執行changeName(myDog)這一行代碼時,myDog這條狗繩,被復制了一份,而傳入到changeName方法里的那條狗繩(dog),就是復制出來的那一條,就像這樣:



接著執行dog= new Dog(),這一行代碼,就是把復制出來的那一條狗繩,從myDog解綁,重新綁到new出來的那只小狗上,也就是后來被起名為“小強”的小狗:


而myDog還是綁在旺財身上,這也就解釋了,為什么執行完方法出來,myDog.getName()還是旺財。而在第一段代碼里面,我們沒有執行dog= new Dog(),也就沒有改變dog所綁的小狗,dog還是綁在旺財身上,因此dog.setName(“小強”) 就把旺財的名字改成小強了。


string的例子


我們再來看一個例子:



如果你弄懂了上面那個例子,那么這里應該不難理解,changeString方法里,只是將新復制出來的引用str,指向另外一個字符串常量對象“bbb”,方法體外面的str并不受影響,還是指向字符串常量“aaa”,因此最終打印的還是aaa。


int的例子


上面提到的都是對象,下面看一個基本數據類型的例子



對于基本數據類型,他們沒有引用,但是不要忘了,調用函數時,復制的動作還是會做的,執行changeInt(i)時,會將 i 復制到一個新的int上,傳給changeInt方法,因此不管changeInt內部對入參做了什么,外面的 i 都不會受影響。最后打印出來的還是1。


值傳遞和引用傳遞


上面提到的參數傳遞過程中的復制操作,說白了,就是 = 操作。把上面那個int例子,做一下方法內聯,其實就是這樣:



對于基本數據類型,= 操作將右邊的變量(R_VALUE)完整的復制給左邊的變量(L_VALUE),而對于對象,準確的說,應該是指向對象的引用(就像上面說的myDog),= 操作同樣也是將右邊的引用完整的復制給左邊的引用,兩者指向同一個對象實例。?


這個?= 操作,是值傳遞和引用傳遞的根本差別,這也導致了值傳遞和引用傳遞有以下直觀上的差別


如果參數是值傳遞,那么調用者(方法體外部)和被調用者(方法體內部)用的是兩個不同的變量,方法體里面對變量的改動不會影響方法體外面的變量。而之所以在Java可以在方法體內部改變方法體外部的對象,是因為方法體內部拿到了對象的引用,但是這個引用是和方法體外部的引用屬于兩個不同的引用的,方法體內部的引用指向別的對象,不會導致方法體外部的引用也指向別的對象。


如果參數是引用傳遞,那么調用者(方法體外部)和被調用者(方法體內部)用的是兩個相同的變量,方法體里面對變量的改動會影響方法體外面的變量。


Java的變量都不是對象


通過上面的講解,你也知道了一個很重要的點:Java里面的變量,要么是基本數據類型,要么是指向對象實例的引用類型(狗繩),絕對不會是一個對象(狗)。


狗繩和垃圾回收


弄懂了myDog只是一條狗繩(引用),也有助于我們理解Java的垃圾回收機制一旦JVM發現一個對象跟GC Roots不可達時,這個對象就會被回收掉


看一下下面這段代碼:



現在我們知道,dog=null就等于是把狗繩給咔嚓減掉了,這樣狗就跑了,變成流浪狗了,就像Java中的對象被當做垃圾回收了一樣:


接著再來看一下交叉引用的例子:



如果JVM采用的是引用計數法,那么狗2原先被dog2和dog1.son兩個變量引用這,執行完dog2 = null之后,還被dog1.son引用,狗2是不會被回收的。?


但是如果使用可達性分析法,我們就會發現,這兩只狗和這個世界已經沒有關聯了,盡管他們倆還是父子關系,JVM對于這種互相引用,但是和GC ROOTS已經沒有關聯的對象,照樣會進行回收。


引用傳遞的替代方法


引用傳遞有兩個好處:


引用傳遞可以避免調用方法時進行拷貝,尤其是當方法的入參是個大對象時,拷貝會耗費大量的時間和空間,當然,這一點Java已經巧妙地解決了,因為對于對象,拷貝的只是它的引用而已;


引用傳遞可以對外面的對象進行修改,這也是很多語言支持引用傳遞的原因。


那么,在Java,要怎么實現“對外面的對象進行修改”類似的功能呢??


答案是使用返回值,類似這樣:



當然,如果你只是對一個對象進行修改,然后返回這個對象的新的版本,那么可以考慮把這個方法挪到這個對象里面去,就像這樣:



還有,如果你是需要返回多個值,不使用引用傳遞,要如何實現??


答案是返回一個對象,比如你想修改一個地方的經度和緯度,那么與其傳入log和lat兩個變量,不如把他們封裝到Point對象里面去。


以上,希望對你有所幫助。


來源:程序人生


總結

以上是生活随笔為你收集整理的用画小狗的方法来解释Java中的值传递的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产乱淫片视频 | 秋霞福利片| 日本熟伦人妇xxxx | 午夜丁香婷婷 | 国产免费一区二区三区免费视频 | av电影免费在线播放 | 熟女人妻一区二区三区免费看 | 一久久久 | 欧美一级片网址 | 国产真人毛片 | 在线99| 小柔的裸露日记h | 韩国伦理片观看 | 麻豆视频传媒入口 | 色www国产亚洲阿娇 自拍一区在线 | 精品国产午夜福利在线观看 | 精品无码久久久久久久 | 伊伊成人网 | 成人毛片18女人毛片免费 | 一区二区三区av夏目彩春 | 日韩一二三四五区 | 男女扒开双腿猛进入爽爽免费 | 国产乱码在线观看 | 日韩欧洲亚洲AV无码精品 | 欧美巨乳在线观看 | 午夜一区二区三区免费 | 欧美三级欧美成人高清 | 在线观看中文字幕码 | 熟妇人妻中文av无码 | 欧美高清性 | 星空大象在线观看免费播放 | 开心激情综合网 | 激情小说亚洲色图 | 超碰按摩| 爱啪啪网站| 欧美性生交xxxxx久久久 | 日日夜夜操操操 | 国产精品久久久免费 | 外国av在线| 中文字幕在线看高清电影 | 成人小视频在线播放 | 综合网色| av中文字幕在线看 | 国产1区| 欧洲成人综合网 | 国产一区二区三区免费在线观看 | 国产精品女主播 | 国产精品视频看看 | 性生生活性生交a级 | 国产午夜精品视频 | 96精品国产| 欧美日韩色图 | 亚洲美女久久 | 亚洲伦理在线 | 天天草夜夜| 国产一级片免费视频 | 肥臀熟女一区二区三区 | 中文在线观看免费视频 | 91爱在线观看| av在线不卡免费 | 能看毛片的网站 | 国产精品九 | 国产欧美精品一区二区三区 | av自拍| 国产精品av一区二区 | 日韩人妻精品中文字幕 | 波多野结衣啪啪 | 青草视频网 | 最新天堂av| 欧洲精品在线观看 | 欧美日韩一二三 | 欧美另类高清 | 欧美 日韩 国产 成人 在线 91 | 毛茸茸亚洲孕妇孕交片 | 久操视频在线免费观看 | 可以在线观看的av网站 | 少妇乱淫36部 | 婷婷亚洲天堂 | 少妇的激情 | 国产欧美一区二区三区四区 | 成人午夜大片 | 桃色网站在线观看 | 午夜激情视频在线 | 污污在线看 | 亚洲欧美日韩久久精品 | 午夜在线你懂的 | 四虎黄网| 象人高潮调教丨vk | 啪啪免费av | 日韩成人福利视频 | 亚洲av永久纯肉无码精品动漫 | 狠狠插综合 | 日本精品久久 | 777奇米视频 | 黄色一级大片在线免费看国产 | 97自拍偷拍视频 | 国产亚洲精品女人久久久久久 | 日韩电影一区二区 | 亚洲AV成人无码精品久久盆瓶 |