1. 程式人生 > 其它 >java物件的值傳遞

java物件的值傳遞

技術標籤:javajava

java只有值傳遞。引用傳遞的說法是不對的。 那麼為什麼有些基礎型別比如int 是值傳遞,有些型別如Object 型別是“引用傳遞”,注意這裡的引用傳遞加了雙引號,因為傳遞物件表現上是為引用。實際上是 值傳遞了 物件 的地址。 我們看一下例子:

package java物件引用;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

public class Main {

public static void main(String [] Args) {

    Result r = process() ;
    List<DataBean> datas = (List<DataBean>) r.getData();

    //改變前
    System.out.println("改變前");
    for (DataBean d: datas
    ) {
        System.out.println(d.getName());
    }

    change(r) ; //值傳遞

    //改變後
    System.out.println("改變後");
    for (DataBean d: (List<DataBean>) r.getData()
    ) {
        System.out.println(d.getName());
    }

}

    public static Result process() {
        Result result  = new Result() ;
        List<DataBean> datas = new ArrayList<>();
        for(int i = 0 ; i< 3 ; i++) {
            DataBean  data = new DataBean() ;
            data.setName("name"+i);
            datas.add(data) ;
        }
        result.setData(datas);
        return result;
    }

    public static void  change(Result r){
        List<DataBean> datas = new ArrayList<>() ; // 方式二
        datas = (List<DataBean>) r.getData();

        //改變1
        datas.get(0).setName("000000000");
        datas.get(1).setName("111111111");

        //改變2
        for(int i = 2;i<3;i++){
            DataBean d = new DataBean();
            d = datas.get(i) ;
            d.setName("區域性變數改變,也影響");
        }

    }
}





class DataBean{
    private  String name ;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}



class Result {
    private  Object data ;

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

我們定義了一個可以存放任意型別的Result 類,然後又定義了一個DataBean 類用來存資料。

process()初始化了 Result ,在主函式裡 呼叫change(Result) 將result 值傳遞。

執行結果如下:

最後的結果還是改變了。