※Call/Pass by Reference
Call/Pass by Value:將變數傳進另一隻方法當參數,方法對這個變數所做的事,和原本的沒有關係。 基本型態Call/Pass by Reference:將變傳進另一隻方法當參數,方法對這個變數所做的事,會影響到原來的。不是基本型態的屬於這個
※
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
System.out.println(list);
xxx(list);
System.out.println(list);
}
public static void xxx(List<String> a){
a.add("a1");
}
※結果:
[]
[a1]
※new
public static void xxx(List<String> a){
a.add("a1");
a.add("a2");
// a = null;
a = new ArrayList<String>();
a.add("a3");
a.add("a4");
System.out.println("in" + a);
}
※結果:
[]
in[a3, a4]
[a1, a2]
※受影響的只在 new 之前,之後自己是獨立的
※a = null、a = 另外一個 List也都和 new 一樣,對原來的 List 不會產生作用,因為指向了別的記憶體空間
※在 C++ 語言裡,java 只有 call by value,只不過傳的是地址而已,所以不能將整個物件改掉,如這個例子,new 或者將別的記憶體空間指定過來就和原來的沒關係了,但如果物件裡的方法可以改變內容是可以的,如上個例子的 List 的 add 方法就是這樣
※這篇文章有說明,C++ 用 &變數名稱就表示 call by reference,從右邊賦值到左邊是可以的
※另一個範例
※
※另一個範例
public class Test {
private String xxx = "x";
// setter/getter... private List<String> list = new ArrayList<>();
// setter/getter...
Test() {
list.add("a");
list.add("b");
list.add("c");
}
public static void main(String[] args) {
Test t1 = new Test();
Test2 t2 = new Test2();
t2.setXxx2(t1.xxx);//*
t2.ooo(t1.getXxx());
System.out.println(t1.getXxx());
System.out.println(t2.getXxx2());
System.out.println("\r\n");
t2.setList2(t1.getList());//*
t2.xxx(t1.getList());
System.out.println(t1.getList());
System.out.println(t2.getList2());
}
}
class Test2 {
private String xxx2;
// setter/getter...
private List<String> list2;
// setter/getter...
public void xxx(List<String> l) {
l.add("d");
l.add("e");
l.add("f");
}
public void ooo(String s) {
s = "o";
}
}
※
沒有留言:
張貼留言