You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用拷贝构造函数深拷贝含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());

    }
}

疑问指引

  1. 遍历传入的Deck参数问题
  • 先理清static修饰符的作用:static变量属于类而非单个实例,当前所有Deck对象共享同一个m_cards链表,这是核心问题之一。先调整m_cards的修饰符,让每个Deck实例拥有独立的卡片集合。
  • 要操作传入的Deck参数的卡片,需要让拷贝构造函数能访问到该参数的卡片列表——可以调整变量的访问权限,或者给Deck类添加获取卡片集合的方法(比如getCards())。
  • 拷贝构造函数中,应该遍历传入的deck对象的卡片列表,而非当前正在创建的对象的列表。
  1. 链表存储对象类型问题
  • Deck作为扑克牌组的容器,职责是管理一组Card对象,所以链表存储Card的思路是正确的,完全不需要存储Deck对象。
  1. deck2打印内容重复的原因
  • 根源在于m_cards是static变量:创建deck1时,默认构造函数把52张牌加到了这个静态链表;创建deck2时,即便拷贝构造函数为空,它仍然使用同一个静态链表,所以打印内容和deck1完全一致。
  • 解决的第一步是移除m_cards的static修饰符,让每个Deck实例拥有自己的独立链表。

内容的提问来源于stack exchange,提问作者Seba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:15:34