2014-07-22 90 views
0

我正在爲Java程序編寫靜態分析工具。例如,在分配操作符的分析過程中,我想知道底層對象是使用按值複製還是按引用複製。區分按值複製和按參考複製實例/對象

在原始數據類型的情況下,我知道,變量使用按值複製。

int x = 5; 
int y = x; // Both are pointing to independent memory locations. 

如果是對象,通常會複製其他對象的引用值。例如,

MyClass obj1 = new MyClass(); 
MyClass obj2 = obj1; // Both instances pointing to the same memory location. 

然而,在特殊情況下,如

String str1 = "myString"; 
String str2 = str1; // Both pointing to independent memory locations. 
str1 = null; // Only str1 gets null 

對象使用複製的價值,在我看來。如果我錯了,請糾正我。類似地,使用final關鍵字聲明的StringBuilder和其他java/lang/*類,其對象/實例的行爲與此類似。但是,當作爲參數傳遞給方法時,它們的參考值將被傳遞。

所以我的問題是,有沒有辦法找到所有這些特殊情況下對象總是使用按值複製行爲?我怎樣才能找到所有這些類?這可能不是一件容易的事,任何一種建議都是值得歡迎的。謝謝。

+0

實際上字符串是不變的,所以是原始封裝類型。 –

+1

你錯了,沒有特殊情況。你爲什麼認爲你的第二個例子與第三個例子不同? –

+0

(我喜歡避免考慮「內存位置」或「指針」......將其留在C中。在低級別情況下,只需考慮引用*值*是代表對象的*不透明標識符*。) – user2864740

回答

1

爲:

String str1 = "myString"; 
String str2 = str1; // Both pointing to independent memory locations. NO! 
str1 = null; // Only str1 gets null 

考慮這個例子:

public static void main(String[] args) { 
     String s1 = "hello"; 
     String s2 = s1; 
     System.out.println(s2 == s1); // true . Both pointing to same location 
s1=null; // s2 still points to "hello" 

    } 
+0

我認爲,你是對的。 s1剛剛開始指向新的內存位置,在這種情況下恰好爲NULL。 – Junaid

+1

* s1剛剛開始指向新的內存位置,這恰好是NULL *是一種*不正確*。 s1實際上並不指向一個*爲null的新位置,它實際上指向* null *,它根本就沒有。 :) – TheLostMind

+0

感謝您的更正。 :) – Junaid