2012-12-18 82 views
1

如果我實例化一個對象並將它傳遞給一個函數,在這個函數中我將這個對象賦值爲null。 似乎從函數返回時,對象仍然存在。分配一個對象爲空

我只是想知道什麼時候分配null,會發生什麼。

+1

添加代碼,以獲得更好的幫助 –

回答

7

您永遠不能分配給對象。你所有的都是原始的和參考。引用是null或指向適當類的對象的指針。

Java參數按值傳遞。你的被調用的方法得到了一個引用的副本。它使該參考爲空。調用方法具有自己的引用,它不受任何傳遞副本的賦值影響。該引用仍然指向該對象。

1

參數在Java方法「傳址值」,這意味着要傳遞的對象引用的副本到方法。分配此引用時,空值將在方法調用內更改其值,但對該方法外的引用不做任何操作,因爲它是副本。用代碼示例:

void doSomething(final String input) { 
    input = null; 
    System.out.println("Input is: " + input); // prints null 
    return; 
} 

final String name = "Bob"; 
doSomething(name); 
System.out.println("Name is: " + name); // prints 'Bob' 
+0

我想'final'妨礙了你的答案的理解。另外:你不能重新分配一個'final'變量(第2行)。 – kay

+0

是的,這確實是重點。在極少數情況下,您發現您需要重新分配一個變量,只是不要最終聲明它。 – Perception

1

時實例化對象,並把它傳遞給函數,並且該函數內你重新分配爲空或什麼,在主叫側它不被反射作爲參數是傳值的參考(複製在對象的情況下),在呼叫方它仍然指向舊對象。如果要限制在方法中重新分配,可以在方法參數

中使用 final關鍵字
0

當您將對象引用傳遞給函數(Java始終調用方法)時,在方法作用域中將創建一個新引用堆棧內存,但是它們指向堆內存中的同一個對象。所以如果你給新引用指定了null,那麼只有這個引用指向該對象的鏈接是break,它不會影響前一個。

+0

當一個參數是一個對象時,它通過引用傳遞;當一個參數是一個基本類型時,它通過值傳遞。引用是指向實際對象的2字節變量。 – BlackJoker

+0

在Java中,它從未**通過引用傳遞 –