2016-04-07 55 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

相關問題