生活随笔
收集整理的這篇文章主要介紹了
JAVA中参数传递问题的总结(按值传递和引用传递)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
關(guān)于JAVA中參數(shù)傳遞問題有兩種,一種是按值傳遞(如果是基本類型),另一種是按引用傳遞(如果是對(duì)象).??首先以兩個(gè)例子開始:??1)?public?class?Test2?{??public?static?void?main?(String?[]?args)?{?StringBuffer?a?=?new?StringBuffer?("A");?StringBuffer?b?=?new?StringBuffer?("B");?operate?(a,b);?System.out.println(a+","+b);?}??static?void?operate(StringBuffer?x,?StringBuffer?y){?x.append(y);?y?=?x;?}?}?輸出:AB,B??2)?public?class?Test2?{??public?static?void?add3?(Integer?i){?int?val=i.intValue();?val?+=?3;?i?=?new?Integer?(val);?}??public?static?void?main?(String?args?[?]?)?{?Integer?i?=?new?Integer?(0);?add3?(i);?System.out.println?(i.intValue?(?));?}?}?輸出:0??首先我們應(yīng)該明白JAVA中的參數(shù)傳遞全是以值傳遞的。是基本類型,就拷貝一個(gè)基本類型傳進(jìn)方法;是引用,就拷貝一個(gè)引用變量傳進(jìn)去方法,理解了這兩點(diǎn)就能理解方法操作對(duì)象的相關(guān)問題了。最好能畫出引用指向?qū)ο蟮膱D出來,就能完全理解了。?第1題,調(diào)用operate方法時(shí),傳入了兩個(gè)引用a,b的拷貝x,y,這兩個(gè)x,y都指向原a,b引用所指向的對(duì)象。x.append(y)對(duì)它指向的?對(duì)象(即a指向的對(duì)象)進(jìn)行了操作。而x=y,只是兩個(gè)拷貝變量在賦值,并沒有影響到原b所指向的對(duì)象。所以b所指向的對(duì)象仍然為B。?第2題,i=new?Integer(val)只是一個(gè)引用的拷貝指向了另外一個(gè)對(duì)象,而原來的i仍然是指向?qū)ο髇ew?Integer(0)的。?把握住了JAVA都是傳值并且傳的都是拷貝的話,類似的題大家都能迎刃而解了。??Java中的參數(shù)傳遞只有一種方式:?by?value.?理論說教太麻煩了,直接看些例子吧:?1).?基本類型?public?class?A{?public?static?void?main(String[]?args){?int?x?=?1;?System.out.println(x);????//1?test(x);?System.out.println(x);????//還是1==>By?value?}??static?void?test(int?a){?a?=?2;?}?}??2).?引用類型?public?class?B{?public?static?void?main(String[]?args){?Integer?x?=?new?Integer(1);?System.out.println(x);?test(x);?System.out.println(x);??}??static?void?test(Integer?a){?a?=?new?Integer(2);?}?}??理解這里的關(guān)鍵是區(qū)分對(duì)象和引用。?這里聲明的x是一個(gè)引用,而不是一個(gè)對(duì)象(只是Java把它設(shè)計(jì)為看上去好像是對(duì)象一樣)。這個(gè)引用它指向了一個(gè)對(duì)象,這個(gè)對(duì)象就是后面用new關(guān)鍵字生成的對(duì)象。因此,可以說x指向了一個(gè)Integer對(duì)象。?在調(diào)用test方法的時(shí)候,程序?qū)作為參數(shù)傳遞給test方法了。這里仍然是值傳遞,在test調(diào)用過程中,會(huì)產(chǎn)生一份新的引用(不妨叫做y)。此時(shí),x和y指向了同一個(gè)對(duì)象。?x和y指向的是同一個(gè)對(duì)象,?由于Java的設(shè)計(jì),我們可以通過操作引用來達(dá)到操作對(duì)象的目的。因此,如果我們此時(shí)使用y來修改對(duì)象的屬性?(例如,y.someField++);?你可以看到x指向的對(duì)象同時(shí)也被修改到了。?另一方面,如果我們讓y指向另外一個(gè)對(duì)象,?y=new?Integer(2);?此時(shí)x和y就指向了不同的?對(duì)象。y修改了它指向的對(duì)象的屬性,很顯然不會(huì)影響到x指向的對(duì)象。??有人說了數(shù)組。數(shù)組也是一個(gè)引用類型,它的參數(shù)傳遞方式按照引用類型的參數(shù)傳遞一樣可以解釋得通:??import?java.util.Arrays;??public?class?A{?public?static?void?main(String[]?args){?int[]?aa?=?{3,?2,?1};?System.out.println(Arrays.toString(aa));?//[3,?2,?1]?test(aa);?System.out.println(Arrays.toString(aa));?//[3,?2,?1]?test2(aa);?System.out.println(Arrays.toString(aa));?//[4,?2,?1]?}??static?void?test(int[]?a){?a?=?new?int[]{1,?2,?3};???//指向了新對(duì)象?}??static?void?test2(int[]?a){?if(a?!=?null?&&?a.length?>?0)?a[0]++;??????????????//修改原來的那個(gè)對(duì)象?}?}??對(duì)象是傳引用,簡(jiǎn)單類型是傳值,不要被網(wǎng)上的一些概念所迷惑!!!你可以自己做個(gè)試驗(yàn)。?至于String等類型傳的還是引用。如果你用concat方法,String對(duì)象的原值就會(huì)被改變。?但你如果按如下方法:?public?class?Test?{?public?static?void?test(String?str)?{?str?=?"World";?}?public?static?void?main(String[]?args)?{?String?string?=?"Hello";?test(string);?System.out.println(string);?}?}?? 運(yùn)行結(jié)果:Hello?這里str?=?"World"?就等同于?String?str=new?String("World")。所以結(jié)果沒有改變!!!?下列程序在1處是否會(huì)有異常,如果沒有,輸出是什么?是否會(huì)運(yùn)行到2處,如果會(huì),輸出是什么?為什么會(huì)有這樣的結(jié)果??? import?java.util.arraylist;?import?java.util.list;??public?class?testclass?{???public?static?void?main(string?args[])?{?list?list?=?new?arraylist();?test2(list);?system.out.println(list.size());?//?1處?test3(list);?system.out.println(list.size());?//?2處?}??public?static?void?test2(list?list)?{?list?=?null;?}??public?static?void?test3(list?list)?{?list.add(“aaaa“);?}?}??plumechen:??不會(huì)出錯(cuò)的。結(jié)果是0,1。??因?yàn)閠est2(list)傳得是list的引用,我理解成指針置的副本,list=null;只是把那個(gè)傳入的值設(shè)置為null,不改變?cè)瓉?list的指針和內(nèi)容。test3(list)傳入的一樣,但是執(zhí)行了list.add()由于傳入指針值的副本也指向原來的那個(gè)list的地址,所以原?來的那個(gè)list的內(nèi)容就改變了,size變成了1了? ?
轉(zhuǎn)載于:https://blog.51cto.com/lya041/669410
總結(jié)
以上是生活随笔為你收集整理的JAVA中参数传递问题的总结(按值传递和引用传递)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。