为什么null赋值不在函数中工作

时间:2016-04-07 12:14:44

标签: java list

我正在尝试以下代码,

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

3 个答案:

答案 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