2016-04-07 22 views
6

我尝试下面的代码,为什么空分配不在函数工作

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

感谢@ColonelThirtyTwo,但我的问题是改编职系的空分配。我知道“Java永远是有价值的,没有例外。”从帖子“http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value” – Kajal

+0

零分配什么_about_?你只是改变'list'指向的东西(在'null'的情况下,它指向什么都不)。 –

回答

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 
} 

这上面的代码不会影响旧的对象,或者它引用的。

+0

谢谢你@艾哈迈德。如果我们使用赋值为null的“new reference getting assigned”对吗? – Kajal

+0

没有。当你调用update2(list)一个“new reference get copied”,并且当你在函数内部调用list = null时,你将复制的refrence改变为指向无。 –

+0

好的,update1(列表)也是一个“复制的参考”吧?所以这些变化如何反映到实际的参考中。 – Kajal

1

参考,像普通老式的数据类型,是按值传递到功能的Java

update2只是使局部参数list参考null。它不是改变什么list在调用者中引用该函数。

所以update2是没有任何操作。

update1修改列表通过传递给该函数的引用。

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()设置列表为空。

这里是输出。

[100,89]

[89]

空现在,这将是空

+0

this.list将忽略传递的参数列表的权利。 – Kajal

+0

提到,如果你需要设置列表为空! –

+0

谢谢Manikanth。但是我试图理解一个传递对象的行为,当我们用null分配时。 – Kajal

相关问题