2016-11-18 99 views
1

你好,我正在做一个扑克游戏。我知道这个浅拷贝构造函数是不正确的,但它为什么不正确?阵列列表的浅拷贝

public Deck() { 
    cards = new ArrayList <Card>(); 

    for (int type= 0; type<=4; type++){ 
     for (int value=1; value<9; value++){ 
      Card newCard = new Card (value, type); 
      cards.add(newCard); 
     } 
    } 

} 

public Deck(Deck other) { 
    ArrayList<Card> cardsCopy = cards; 

    } 

回答

1
public Deck(Deck other) { 
    ArrayList<Card> cardsCopy = cards;  
    } 

这里cardsCopy是不相关的一个Deck实例。它是一个孤立的变量,只要构造函数完成执行,变量就不会再存在。
若要拥有otherDeck的浅拷贝,您应分配给您正在创建的副本的cards字段,以及从other实例引用的cards字段。

浅拷贝构造函数可以是:

public Deck(Deck other) { 
    cards = other.cards; 
} 

但是当你在你的问题的标题,因为cards场要求无论是在原和副本指的是不是ArrayList浅表副本同一个对象。

要与的ArrayList浅拷贝浅拷贝构造函数,你可以这样做:

public Deck(Deck other) { 
    cards = new ArrayList<Card>(other.cards); 
} 

或使用ArrayList定义的clone()方法:

public Deck(Deck other) { 
    cards = other.cards.clone(); 
}