Java中的值傳遞以及引用傳遞和數(shù)組傳遞詳解
與其他語言不同,Java不允許程序員選擇按值傳遞還是按引用傳遞各個(gè)參數(shù),基本類型(byte–short–int–long–float–double–boolean–char)的變量總是按值傳遞。
就對(duì)象而言,不是將對(duì)象本身傳遞給方法,而是將對(duì)象的的引用或者說對(duì)象的首地址傳遞給方法,引用本身是按值傳遞的
也就是說,講引用的副本傳遞給方法(副本就是說明對(duì)象此時(shí)有兩個(gè)引用了),通過對(duì)象的引用,方法可以直接操作該對(duì)象(當(dāng)操作該對(duì)象時(shí)才能改變該對(duì)象,而操作引用時(shí)源對(duì)象是沒有改變的)。
現(xiàn)在說說數(shù)組:
如果將單個(gè)基本類型數(shù)組的元素傳遞給方法,并在方法中對(duì)其進(jìn)行修改,則在被調(diào)用方法結(jié)束執(zhí)行時(shí),該元素中存儲(chǔ)的并不是修改后的值,因?yàn)檫@種元素是按值傳遞,如果傳遞的是數(shù)組的引用,則對(duì)數(shù)組元素的后續(xù)修改可以在原始數(shù)組中反映出來(因?yàn)閿?shù)組本身就是個(gè)對(duì)象,int[] a = new int[2];,這里面的int是數(shù)組元素的類型,而數(shù)組元素的修改是操作對(duì)象)。
對(duì)于單個(gè)非基本類型數(shù)組的元素在方法中修改,則在被調(diào)用方法結(jié)束執(zhí)行時(shí),該元素中存儲(chǔ)的是修改后的值,因?yàn)檫@種元素是按引用傳遞的,對(duì)象的改動(dòng)將在源數(shù)組的數(shù)組元素中反映出來。
下面看個(gè)小程序:
public class Test{ String str = new String("good"); char[] ch = {'a','b','c'}; int i = 10; public void change(String str,char[] ch,int i){ str = "test ok"; ch[0] = 'g'; i++; } public static void main(String[] args){ Test tt = new Test(); tt.change(tt.str,tt.ch,tt.i); System.out.println(tt.i); System.out.print(tt.str+" and "); System.out.println(tt.ch); } }
str是String類型的引用,i是基本類型變量,ch是數(shù)組名,也是數(shù)組對(duì)象的引用
在chang()方法里,str=”test ok”,是一個(gè)新的對(duì)象把首地址放在引用變量str上;
而ch[0]=’g’;因?yàn)閭鞯氖菙?shù)組的引用,而此時(shí)ch[0]=’g’;是對(duì)數(shù)組元素的操作,能修改源數(shù)組的內(nèi)容;
i是整型值,只是把值copy了一份給方法,在方法的變化是不改變的源i的。
所以結(jié)果是:
10
good and gbc
現(xiàn)在咱們把代碼變化一下:
public class Test{ String str = new String("good"); char[] ch = {'a','b','c'}; int i = 10; public void change(String str,char ch,int i){ str = "test ok"; ch = 'g'; this.i = i+1; } public static void main(String[] args){ Test tt = new Test(); tt.change(tt.str,tt.ch[0],tt.i); System.out.println(tt.i); System.out.print(tt.str+" and "); System.out.println(tt.ch); } }
仔細(xì)觀察下實(shí)參以及入?yún)⒂泻巫兓?/p>
change()方法里的入?yún)har[] ch變成————–char ch;
這次傳遞的是個(gè)char值的單個(gè)數(shù)組元素,按照上面的解析,此時(shí)ch=’9’;是不影響源數(shù)組元素的。
this.i = i+1;這里面等號(hào)左邊的i是屬性i,等號(hào)右邊的i是局部變量(入?yún)⒗锏膇);
此時(shí)i+1后賦值給屬性的i,自然會(huì)改變屬性i的值,同時(shí)17行,tt.i又是調(diào)用屬性的i,這次的結(jié)果是:
11
good and abc
現(xiàn)在是不是有點(diǎn)明白了?
那好再看下面一個(gè)小程序
public class Test{ public void change(StringBuffer x,StringBuffer y){ x.append(y); y=x; } public static void main(String[] args){ StringBuffer buffA = new StringBuffer("a"); StringBuffer buffB = new StringBuffer("b"); new Test().change(buffA,buffB); System.out.println(buffA+","+buffB); } }
這次傳遞的是兩個(gè)對(duì)象的引用的值,
在方法change()里 的x.append(y), 其中引用x調(diào)用api方法append()修改了new StringBuffer(“a”);的內(nèi)容。
y=x;是一個(gè)修改內(nèi)容的對(duì)象把首地址賦值給引用變量y了,此時(shí)操作的是引用,而先前y是new StringBuffer(“b”);的引用變量,所以輸出結(jié)果是:
ab,b
下面是個(gè)稍難的小程序,先自己用筆畫畫過程,寫出自己的結(jié)果,而后再上機(jī)操作下
如果自己的結(jié)果和在電腦上的結(jié)果一樣,那么再碰到這類題就不難了,如果不一樣,回頭仔細(xì)體會(huì)下我前面的講解,找找原因。
public class Test{ private String nn = new String("1"); private String[] mm = {"2","5"}; void test(String nn,String[] mm){ nn = new String("3"); this.nn = "9"; mm[0] = "4"; System.out.println("in test(),mm[0]: "+mm[0]); mm = new String[]{"8","7"}; System.out.println("in test(),nn: "+nn); System.out.println("this.nn: "+this.nn); System.out.println("mm[0]: "+mm[0]); } public static void main(String[] args){ Test s = new Test(); s.test(s.nn,s.mm); System.out.println(s.nn+" "+s.mm[0]); } }
到此這篇關(guān)于Java中的值傳遞以及引用傳遞和數(shù)組傳遞詳解的文章就介紹到這了,更多相關(guān)Java值傳遞引用傳遞和數(shù)組傳遞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Eclipse添加xml文件提示及Hibernate配置學(xué)習(xí)
文件提示功能在開發(fā)過程中很實(shí)用的,本文實(shí)現(xiàn)了一個(gè)Eclipse添加xml文件提示,感興趣的朋友可以了解下啊,希望本文對(duì)你有所幫助2013-01-01Java實(shí)現(xiàn)的Windows資源管理器實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的Windows資源管理器,實(shí)例分析了基于java實(shí)現(xiàn)windows資源管理器的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07JSP、Servlet中g(shù)et請(qǐng)求和post請(qǐng)求的區(qū)別總結(jié)
這篇文章主要介紹了JSP、Servlet中g(shù)et請(qǐng)求和post請(qǐng)求的區(qū)別總結(jié),列舉了多條不同點(diǎn),需要的朋友可以參考下2014-07-07解決Springboot @WebFilter攔截器未生效問題
這篇文章主要介紹了解決Springboot @WebFilter攔截器未生效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10Java基于二分搜索樹、鏈表的實(shí)現(xiàn)的集合Set復(fù)雜度分析實(shí)例詳解
這篇文章主要介紹了Java基于二分搜索樹、鏈表的實(shí)現(xiàn)的集合Set復(fù)雜度分析,結(jié)合實(shí)例形式詳細(xì)分析了Java基于二分搜索樹、鏈表的實(shí)現(xiàn)的集合Set復(fù)雜度分析相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-03-03一文帶你了解Java創(chuàng)建型設(shè)計(jì)模式之原型模式
原型模式其實(shí)就是從一個(gè)對(duì)象在創(chuàng)建另外一個(gè)可定制的對(duì)象,不需要知道任何創(chuàng)建的細(xì)節(jié)。本文就來通過示例為大家詳細(xì)聊聊原型模式,需要的可以參考一下2022-09-09解決Request獲取請(qǐng)求數(shù)據(jù)中文亂碼問題
這篇文章主要介紹了Request獲取請(qǐng)求數(shù)據(jù)中文亂碼問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07SpringBoot實(shí)現(xiàn)自動(dòng)配置的示例代碼
本文主要介紹了SpringBoot實(shí)現(xiàn)自動(dòng)配置的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01Java在運(yùn)行時(shí)識(shí)別類型信息的方法詳解
這篇文章主要給大家介紹了關(guān)于Java在運(yùn)行時(shí)識(shí)別類型信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考借鑒,下面來一起看看吧2019-01-01