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

歡迎訪問 生活随笔!

生活随笔

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

java

Java主方法引用传递_java方法中的参数传递是值传递还是引用传递(转)

發布時間:2025/3/20 java 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java主方法引用传递_java方法中的参数传递是值传递还是引用传递(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、當參數變量為基本數據類型或者字符串時:

... ...

//定義了一個改變參數值的函數

public static void changeValue(int x) {

x = x *2;

}

... ...

//調用該函數

int num = 5;

System.out.println(num);

changeValue(num);

System.out.println(num);

... ...

答案顯而易見,調用函數changeValue()前后num的值都沒有改變。

由此做一個引子,我用圖表描繪一個值傳遞的過程:

num作為參數傳遞給changeValue()方法時,是將內存空間中num所指向的那個存儲單元中存放的值,即"5",傳送給了changeValue()方法中的x變量,而這個x變量也在內存空間中分配了一個存儲單元,這個時候,就把num的值5傳送給了這個存儲單元中。此后,在changeValue()方法中對x的一切操作都是針對x所指向的這個存儲單元,與num所指向的那個存儲單元沒有關系了!

自然,在函數調用之后,num所指向的存儲單元的值還是沒有發生變化,這就是所謂的“值傳遞”!值傳遞的精髓是:傳遞的是存儲單元中的內容,而非地址或者引用!

2、當參數變量為引用類型時(一般指引用對象):

... ...classperson {public static String name = "Jack";

... ...

}

... ...//定義一個改變對象屬性的方法

public static voidchangeName(Person p) {

p.name= "Rose";

}

... ...public static voidmain(String[] args) {//定義一個Person對象,person是這個對象的引用

Person person = newPerson();//先顯示這個對象的name屬性

System.out.println(person.name);//調用changeName(Person p)方法

changeName(person);//再顯示這個對象的name屬性,看是否發生了變化

System.out.println(person.name);

}

依次顯示:"Jack" ?"Rose"

為什么這里是“值傳遞”,而不是“引用傳遞”?

我還是用圖表描繪比較能解釋清楚:

主函數中new 了一個對象Person,實際分配了兩個對象:新創建的Person類的實體對象,和指向該對象的引用變量person。

【注意:在java中,新創建的實體對象在堆內存中開辟空間,而引用變量在棧內存中開辟空間】

正如如上圖所示,左側是堆空間,用來分配內存給新創建的實體對象,紅色框是新建的Person類的實體對象,000012是該實體對象的起始地址;而右側是棧空間,用來給引用變量和一些臨時變量分配內存,新實體對象的引用person就在其中,可以看到它的存儲單元的內容是000012,記錄的正是新建Person類實體對象的起始地址,也就是說它指向該實體對象。

調用了changeName()方法,person作為對象參數傳入該方法,但是大家特別注意,它傳入的是什么!!!person引用變量將自己的存儲單元的內容傳給了changeName()方法的p變量!也就是將實體對象的地址傳給了p變量,從此,在changeName()方法中對p的一切操作都是針對p所指向的這個存儲單元,與person引用變量所指向的那個存儲單元再沒有關系了!(這幾句話是有問題的,原文下面的評論已經提出,結合本文后面的延伸閱讀,給出比較合理的解釋是:對象的引用person,本身就是一個指針(引用?),指向類實體,而不是存放類實體的地址值,因為引用類型本身在棧中是沒有值的。person作為參數傳入方法時,其實傳遞的是一個指針,只不過該指針指向了類實體,方法操作的就是這個類實體的地址值,而不是什么指針,計算機無法對指針進行運算吧?計算機只能計算具體的值。評論中提到:其實按值還是按引用的區別在于“是否在傳遞的時候進行對象的內存拷貝”,java中基本類型是由于在JVM中存儲區域不同于普通對象所以傳遞前會拷貝,傳遞的是拷貝后的值,但是對象在傳遞的時候不拷貝,直接傳“引用值”,指向同一片對象堆內存區域)

轉載出處:http://guhanjie.iteye.com/blog/1683637

3、延伸閱讀:

java的內存分配(4部分):

裝載編譯后的java文件(class文件);

存儲裝靜態變量的,例如用static關鍵字的變量,字符串常量等;

stack:也就是棧,是用來裝基本數據類型的變量和引用類型的變量!但區別在于,裝了基本數據類型的變量以后,變量上是有值的,而引用類型本身在stack上是沒有值的;

heap:也就是堆!堆可以一句話概括,存放new出來的東西(地址值)

所以綜上所述,基本數據類型都在stack中,而引用類型,變量是放在stack中,真正有內容的東西放在heap中,也就是當new了一個新的引用類型,他就會放在堆中,同時棧中的引用類型變量會指向堆中你new出來的東西!

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Java主方法引用传递_java方法中的参数传递是值传递还是引用传递(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 精品日韩av | 亚洲国产一级 | 久久亚洲区 | 114国产精品久久免费观看 | 国产美女白浆 | 亚洲最大视频网站 | 懂色av色吟av夜夜嗨 | 尤物视频在线观看国产 | 久久精品色妇熟妇丰满人妻 | 亚洲国产精品久久久久爰色欲 | 国产二区免费 | 精品爆乳一区二区三区无码av | 久久久观看 | 日本骚少妇 | 影音先锋中文字幕一区 | 日中文字幕 | 无码视频在线观看 | 亚洲精品乱码久久久久久不卡 | 变态另类丨国产精品 | 99这里都是精品 | 极品久久 | 欧美极品在线视频 | 成人看 | 亚洲有吗在线 | 国产欧美一区二区三区在线看蜜臀 | 国产日韩成人内射视频 | 激情视频区 | 无码人妻精品一区二区三区温州 | 人妻无码久久精品人妻 | 久久久久美女 | 中国男女全黄大片 | 日本888xxxx| 国产又黄又粗又爽 | 亚洲欧美偷拍一区 | 捆绑无遮挡打光屁股 | 91视频.com| 你懂的国产在线 | 本道久久 | 色综合图片 | 香蕉视频网页 | 激情视频激情小说 | 麻豆亚洲av成人无码久久精品 | 91免费.| 精品啪啪 | 伦hdwww日本bbw另类 | 精品国产免费视频 | 色女人av | 深夜毛片 | 熟女少妇内射日韩亚洲 | 亚州男人的天堂 | 日本精品久久久久久久 | 人人插人人爽 | 九月婷婷色 | 超碰碰97| 亚洲在线视频播放 | v天堂在线 | 使劲插视频 | 波多野结衣在线观看一区二区三区 | 男人手机天堂 | 日本一区二区三区免费看 | 午夜国产视频 | 一区二区在线视频免费观看 | 日本成人免费 | 国产a一级片 | 麻豆chinese新婚xxx | 亚洲男人在线 | avav亚洲 | 久在线| 久99热 | 日本小视频网站 | 一区二区高清视频 | 欧美色女人 | av黄色一级片 | 国产suv精品一区二区三区 | 午夜理伦三级理论 | 午夜试看120秒 | 国产精品aⅴ| 1000部拍拍拍18勿入免费视频 | 穿情趣内衣被c到高潮视频 欧美性猛交xxxx黑人猛交 | 欧美午夜久久 | 久久国产中文 | 日韩激情精品 | 国产50页 | 黄色片网站国产 | 精品视频一区二区三区 | 国产乱码久久久 | 特黄aaaaaaaaa真人毛片 | 自拍偷拍亚洲图片 | 久久久久久久久久久久Av | 极品美女一区二区三区 | 亚洲毛茸茸 | 91美女片黄 | 农村少妇久久久久久久 | 视频精品一区二区 | 亚洲视频国产 | 日本99热| 99久久国产综合 | 亚洲国产成人综合 | 一起草国产 |