關於寫java中傳參為陣列時值改變的問題。
阿新 • • 發佈:2018-12-21
為什麼寫這個呢因為以前對都是對基本型別進行操作的時候後,返回的值並不會改變,但如果是陣列的話就會改變。
以下這段加了下滑線的話是引用https://www.cnblogs.com/PopShow/p/5207974.html這個部落格的
在java中,不允許程式設計師選擇值傳遞還是地址傳遞各個引數,基本型別總是按值傳遞。對於物件來說,是將物件的引用也就是副本傳遞給了方法,在方法中只有對物件進行修改才能影響該物件的值,操作物件的引用時是無法影響物件。
現在說說陣列:如果將單個基本型別陣列的元素傳遞給方法,並在方法中對 其進行修改,則在被呼叫方法結束執行時,該元素中儲存的並不是修改後的值,因為這種元素是按值傳遞,如果傳遞的是陣列的引用,則對陣列元素的後續修改可以 在原始陣列中反映出來(因為陣列本身就是個物件,int[] a = new int[2];,這裡面的int是陣列元素的型別,而陣列元素的修改是操作物件)。
直接看測試程式碼:
package transit; import java.util.ArrayList; import java.util.List; public class test { public static void main(String args[]){ /* byte [] requestContent={0x01,0x02,0x03}; byte [] newRequestContent=new byte[3]; System.arraycopy(requestContent,0,newRequestContent,0,3); requestContentDetail(newRequestContent); System.out.print(requestContent[1]);*/ int []a={1,2,3}; byte []b={0x01,0x02,0x03}; int c=10; String str =new String("helloWorld"); List list=new ArrayList(); list.add(1); list.add(2); System.out.println("進入函式前:"); System.out.println("整型陣列:"+a[0]+"位元組型陣列:"+b[0]+"整型:" + c); System.out.println("字串:"+str+"陣列大小:"+list.size()); math(a,b,c,str,list); System.out.println("進入函式後:"); System.out.println("整型陣列:"+a[0]+" 位元組型陣列:"+b[0]+" 整型:" + c); System.out.println("字串:"+str+" 陣列大小:"+list.size()); } public static void math(int []a,byte[] b,int c,String str,List list){ a[0]=100; b[0]=0x09; c++; ++c; str="tonight eat chicken"; list.add(3); System.out.println(); System.out.println("進入函式時:"); System.out.println("整型陣列:"+a[0]+"位元組型陣列:"+b[0]+"整型:" + c); System.out.println("字串:"+str+"陣列大小:"+list.size()); System.out.println(); } }
點選執行後執行輸出的值就可以很直觀的看到具體是怎麼回事了
=========================================分割線==================================================
關於java中的po物件也有這樣子的問題需要使用jdk自帶的BeanUtils.copyProperties方法複製物件
直接上程式碼,程式碼中的物件為任意物件。
public static void main(String[] args) { try { T t1 =new T(); T t2 =new T(); t1.setObject("1"); BeanUtils.copyProperties(t2,t1); t2.setObject("2"); System.out.println(t1.getObject()+" "+t2.getObject()); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }
控制檯打印出來的話就會是1 2,而不是2,2(如果兩個物件直接用等號賦值)