我正在尝试以下代码,
public void test() {
List<Integer> list = new ArrayList<>();
list.add(100);
list.add(89);
System.out.println(list);
update1(list);
System.out.println(list);
update2(list);
System.out.println(list);
}
public void update1(List<Integer> list) {
list.remove(0);
}
public void update2(List<Integer> list) {
list = null;
}
我收到以下输出,
[100,89]
[89]
[89]
我的问题是,为什么我无法在被调用的函数中将列表指定为 null ?
答案 0 :(得分:5)
因为java中的所有方法调用都是按值传递的,这意味着在调用另一个函数时复制了引用,但这两个函数指向同一个对象。
指向同一对象的两个参考副本。
另一个例子是
public void update2(List<Integer> list) {
list = new ArrayList<>(); // The new refrence got assigned to a new object
list.add(23); // Add 23 to the new list
}
上面的代码片段不会影响旧对象或它的引用。
答案 1 :(得分:1)
引用通过值按传递给Java中的函数
update2
只是让本地参数list
引用null
。 不会将调用者中list
引用的内容更改为该函数。
所以update2
是无操作。
update1
修改列表到传递给该函数的引用。
答案 2 :(得分:0)
如需更多说明,您也可以尝试这种方式
List<Integer> list = new ArrayList<>();
public void test() {
list.add(100);
list.add(89);
System.out.println(list);
update1(list);
System.out.println(list);
update2(list);
System.out.println(list+"not null");
}
public void update1(List<Integer> list) {
list.remove(0);
}
public void update2(List<Integer> list) {
this.list = null;
}
使用this keyword
update2()将list设置为null。
这是输出。
[100,89]
[89]
null现在它将为null