java物件的值傳遞
阿新 • • 發佈:2020-12-27
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 值傳遞。
執行結果如下:
最後的結果還是改變了。