2012-07-06 179 views
1

當我創建一個球的實例,然後將其複製到另一個變量時,更改原始參數會更改球的副本。例如,採取非常簡化的例子如下:更改一個變量會改變另一個變量

class Ball() { 
    Color _color; 
    public Ball(Color startColor) { 
     _color = startColor; 
    } 
    public void setColor(Color newColor) { 
     _color = newColor; 
    } 
} 
Ball myBall = new Ball(black); 
Ball mySecondBall = myBall; 
myBall.setColor(white); 

我省略掉了_Color的訪問方法,但如果我拿到球的顏色,他們兩人現在都是白色的!所以我的問題是:

  • 爲什麼改變一個對象改變它的一個副本,並
  • 有沒有辦法複製的對象,以便您可以獨立改變他們?

回答

4

Ball mySecondBall = myBall;

這不會創建副本。您分配參考。現在兩個變量都指向同一個對象,這就是爲什麼變化對兩個變量都可見。
你應該做的事情想創建一個new Ball複製相同的顏色:

Ball mySecondBall = new Ball(myBall.getColor());

+0

'myBall'不是'Ball';這是對'Ball'的引用。 – 2012-07-06 20:25:10

+0

有沒有辦法制作一個對象的副本,以便可以在不更改新對象的情況下更改原始對象? – 2012-07-06 20:29:24

+0

@LouisWasserman:當然。我說錯了什麼? – Cratylus 2012-07-06 20:29:54

1

沒有拷貝,也有對的Ball同一個實例的兩個引用賦值後:

Ball mySecondBall = myBall; 

若要創建副本,請實施Ball的複製構造函數:

class Ball() { 
    Color _color; 
    public Ball(Color startColor) { 
     _color = startColor; 
    } 
    public Ball(final Ball otherBall) { 
     _color = otherBall._color; 
    } 
    public void setColor(Color newColor) { 
     _color = newColor; 
    } 
} 

要使用:

Ball myBall = new Ball(black); 
Ball mySecondBall = new Ball(myBall); 
0

你只有一個Ball對象。 myBallmySecondBall均指向同一個Ball對象。

0

正如其他人所說,問題是你有兩個引用相同的實際實例。我喜歡使用的一個比喻是,你有兩個遙控器用於同一臺電視機。

如果你想有兩個球,你可以這樣做:

class Ball() { 
    public Ball(Ball original){ 
     _color = original.getColor(); 
    } 
...etc... 
} 

Ball myBall = new Ball(black); 
Ball mySecondBall = new Ball(myBall); 
myBall.setColor(white);