如何用拷贝构造函数深拷贝含LinkedList的Deck对象?及相关问题
扑克牌组深拷贝问题指引
注:这是学校项目,仅提供方向指引,不给出直接答案
现有代码如下:
import java.util.LinkedList; public class Deck { static LinkedList<Card> m_cards = new LinkedList<Card>(); Card card; public Deck() { for(int i = 0; i <= 3; i++) { for (int j = 2; j <= 14; j++) { card = new Card(j, i); m_cards.add(card); System.out.println(card); } } } public Deck(Deck deck) { for(Card card : m_cards) { } } public String toString() { String cards = ""; for (int i = 0; i < m_cards.size(); i++) { cards += m_cards.get(i) + ", "; } return cards + size(m_cards) + " total cards. "; } public int size(LinkedList<Card> list) { return list.size(); } public static void main(String[] args) { Deck deck1 = new Deck(); Deck deck2 = new Deck(deck1); System.out.println(deck1.toString()); // System.out.println(deck2.toString()); } }
疑问指引
- 遍历传入的Deck参数问题
- 先理清
static修饰符的作用:static变量属于类而非单个实例,当前所有Deck对象共享同一个m_cards链表,这是核心问题之一。先调整m_cards的修饰符,让每个Deck实例拥有独立的卡片集合。 - 要操作传入的Deck参数的卡片,需要让拷贝构造函数能访问到该参数的卡片列表——可以调整变量的访问权限,或者给Deck类添加获取卡片集合的方法(比如
getCards())。 - 拷贝构造函数中,应该遍历传入的deck对象的卡片列表,而非当前正在创建的对象的列表。
- 链表存储对象类型问题
- Deck作为扑克牌组的容器,职责是管理一组Card对象,所以链表存储Card的思路是正确的,完全不需要存储Deck对象。
- deck2打印内容重复的原因
- 根源在于
m_cards是static变量:创建deck1时,默认构造函数把52张牌加到了这个静态链表;创建deck2时,即便拷贝构造函数为空,它仍然使用同一个静态链表,所以打印内容和deck1完全一致。 - 解决的第一步是移除
m_cards的static修饰符,让每个Deck实例拥有自己的独立链表。
内容的提问来源于stack exchange,提问作者Seba
相关产品推荐
相关产品推荐

