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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

java传参数的方法_java中方法的参数传递机制

發(fā)布時(shí)間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java传参数的方法_java中方法的参数传递机制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

無(wú)論是什么語(yǔ)言,要討論參數(shù)傳遞方式,就得從內(nèi)存模型說(shuō)起,主要是我個(gè)人覺(jué)得從內(nèi)存模型來(lái)說(shuō)參數(shù)傳遞更為直觀一些。閑言少敘,下面我們就通過(guò)內(nèi)存模型的方式來(lái)討論一下Java中的參數(shù)傳遞。

這里的內(nèi)存模型涉及到兩種類型的內(nèi)存:棧內(nèi)存(stack)和堆內(nèi)存(heap)。基本類型作為參數(shù)傳遞時(shí),傳遞的是這個(gè)值的拷貝。無(wú)論你怎么改變這個(gè)拷貝,原值是不會(huì)改變的。看下邊的一段代碼,然后結(jié)合內(nèi)存模型來(lái)說(shuō)明問(wèn)題:

public class ParameterTransfer {

public static void main(String[] args) {

int num = 30;

System.out.println("調(diào)用add方法前num=" + num);

add(num);

System.out.println("調(diào)用add方法后num=" + num);

}

public static void add(int param) {

param = 100;

}

}

這段代碼運(yùn)行的結(jié)果如下:

調(diào)用add方法前num=30

調(diào)用add方法后num=30

程序運(yùn)行的結(jié)果也說(shuō)明這一點(diǎn),無(wú)論你在add()方法中怎么改變參數(shù)param的值,原值num都不會(huì)改變。

下邊通過(guò)內(nèi)存模型來(lái)分析一下。

當(dāng)執(zhí)行了int num = 30;這句代碼后,程序在棧內(nèi)存中開(kāi)辟了一塊地址為AD8500的內(nèi)存,里邊放的值是30,內(nèi)存模型如下圖:

執(zhí)行到add()方法時(shí),程序在棧內(nèi)存中又開(kāi)辟了一塊地址為AD8600的內(nèi)存,將num的值30傳遞進(jìn)來(lái),此時(shí)這塊內(nèi)存里邊放的值是30,執(zhí)行param = 100;后,AD8600中的值變成了100。內(nèi)存模型如下圖:

? ? ? ? ? ? ? ? ?

地址AD8600中用于存放param的值,和存放num的內(nèi)存沒(méi)有任何關(guān)系,無(wú)論你怎么改變param的值,實(shí)際改變的是地址為AD8600的內(nèi)存中的值,而AD8500中的值并未改變,所以num的值也就沒(méi)有改變。

以上是基本類型參數(shù)的傳遞方式,下來(lái)我們討論一下對(duì)象作為參數(shù)傳遞的方式。

先看下邊的示例代碼:

public class ParameterTransfer {

public static void main(String[] args) {

String[] array = new String[] {"huixin"};

System.out.println("調(diào)用reset方法前array中的第0個(gè)元素的值是:" + array[0]);

reset(array);

System.out.println("調(diào)用reset方法后array中的第0個(gè)元素的值是:" + array[0]);

}

public static void reset(String[] param) {

param[0] = "hello, world!";

}

}

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

調(diào)用reset方法前array中的第0個(gè)元素的值是:huixin

調(diào)用reset方法后array中的第0個(gè)元素的值是:hello, world!

當(dāng)對(duì)象作為參數(shù)傳遞時(shí),傳遞的是對(duì)象的引用,也就是對(duì)象的地址。下邊用內(nèi)存模型圖來(lái)說(shuō)明。

當(dāng)程序執(zhí)行了String[] array = new String[] {"huixin"}后,程序在棧內(nèi)存中開(kāi)辟了一塊地址編號(hào)為AD9500內(nèi)存空間,用于存放array[0]的引用地址,里邊放的值是堆內(nèi)存中的一個(gè)地址,示例中的值為BE2500,可以理解為有一個(gè)指針指向了堆內(nèi)存中的編號(hào)為BE2500的地址。堆內(nèi)存中編號(hào)為BE2500的這個(gè)地址中存放的才是array[0]的值:huixin。

當(dāng)程序進(jìn)入reset方法后,將array的值,也就是對(duì)象的引用BE2500傳了進(jìn)來(lái)。這時(shí),程序在棧內(nèi)存中又開(kāi)辟了一塊編號(hào)為AD9600的內(nèi)存空間,里邊放的值是傳遞過(guò)來(lái)的值,即AD9600。可以理解為棧內(nèi)存中的編號(hào)為AD9600的內(nèi)存中有一個(gè)指針,也指向了堆內(nèi)存中編號(hào)為BE2500的內(nèi)存地址,如圖所示:

這樣一來(lái),棧內(nèi)存AD9500和AD9600(即array[0]和param的值)都指向了編號(hào)為BE2500的堆內(nèi)存。

在reset方法中將param的值修改為hello, world!后,內(nèi)存模型如下圖所示:

改變對(duì)象param的值實(shí)際上是改變param這個(gè)棧內(nèi)存所指向的堆內(nèi)存中的值。param這個(gè)對(duì)象在棧內(nèi)存中的地址是AD9600,里邊存放的值是BE2500,所以堆內(nèi)存BE2500中的值就變成了hello,world!。程序放回main方法之后,堆內(nèi)存BE2500中的值仍然為hello,world!,main方法中array[0]的值時(shí),從棧內(nèi)存中找到array[0]的值是BE2500,然后去堆內(nèi)存中找編號(hào)為BE2500的內(nèi)存,里邊的值是hello,world!。所以main方法中打印出來(lái)的值就變成了hello,world!

小結(jié):

無(wú)論是基本類型作為參數(shù)傳遞,還是對(duì)象作為參數(shù)傳遞,實(shí)際上傳遞的都是值,只是值的的形式不用而已。第一個(gè)示例中用基本類型作為參數(shù)傳遞時(shí),將棧內(nèi)存中的值30傳遞到了add方法中。第二個(gè)示例中用對(duì)象作為參數(shù)傳遞時(shí),將棧內(nèi)存中的值BE2500傳遞到了reset方法中。當(dāng)用對(duì)象作為參數(shù)傳遞時(shí),真正的值是放在堆內(nèi)存中的,傳遞的是棧內(nèi)存中的值,而棧內(nèi)存中存放的是堆內(nèi)存的地址,所以傳遞的就是堆內(nèi)存的地址。這就是它們的區(qū)別。

補(bǔ)充一下,在Java中,String是一個(gè)引用類型,但是在作為參數(shù)傳遞的時(shí)候表現(xiàn)出來(lái)的卻是基本類型的特性,即在方法中改變了String類型的變量的值后,不會(huì)影響方法外的String變量的值。關(guān)于這個(gè)問(wèn)題,可以參考如下兩個(gè)地址:

我覺(jué)得是這兩篇文章中提到的兩個(gè)原因?qū)е碌?#xff0c;一個(gè)是String實(shí)際上操作的是char[],可以理解為String是char[]的包裝類。二是給String變量重新賦值后,實(shí)際上沒(méi)有改變這個(gè)變量的值,而是重新new了一個(gè)String對(duì)象,改變了新對(duì)象的值,所以原來(lái)的String變量的值并沒(méi)有改變。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的java传参数的方法_java中方法的参数传递机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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