2013-11-27 76 views
0

我在Java中出現了一些奇怪的問題。我在調試時已經確定了整個問題。它發生在這2條線上:瞭解對象變量賦值行爲

q=p; 
q.addPair(2,3); 

筆記:p,q是我定義的新類。在這門課上,它有一個public function addPari(int, int)

這是我所期待的:複製pq,然後更改q使用q.addPair(),但留下p和以前一樣。

我認爲這可以工作,但不知何故,結果發現q.addPair(2,3)將改變pq。任何人都可以幫助我呢?

+0

Java從不復制任何東西。 – SLaks

回答

5
q=p; 

實際上並不複製。這意味着修改q也將修改p,因爲它們是相同的實例。

如果你想q是一個新的對象,你需要使用new

q = new MyObject(p); 

換句話說,您使用的是copy constructor創造p新副本。如果您的類沒有複製構造函數,則需要創建一個:它需要能夠從現有的對象創建一個新對象。它可以通過複製給定實例p的適當值來實現。

+2

請注意這一點; Java默認不提供拷貝構造函數,所以你必須自己在'P'和'Q'是實例的類中實現它。 – Tenner

0

隨着q=p;你不「複製」 P到Q,但你而是創建當q指向p的實例的引用。現在2個變量指向同一個對象。