1. 程式人生 > >關於寫java中傳參為陣列時值改變的問題。

關於寫java中傳參為陣列時值改變的問題。

為什麼寫這個呢因為以前對都是對基本型別進行操作的時候後,返回的值並不會改變,但如果是陣列的話就會改變。

以下這段加了下滑線的話是引用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(如果兩個物件直接用等號賦值)