首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表浅表

列表浅表
EN

Stack Overflow用户
提问于 2016-11-18 18:20:38
回答 1查看 1.3K关注 0票数 1

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

代码语言:javascript
复制
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;

    }   
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-18 19:24:42

代码语言:javascript
复制
public Deck(Deck other) {
    ArrayList<Card> cardsCopy  = cards;    
    }   

这里,cardsCopyDeck实例无关。它是一个孤立的变量,一旦构造函数完成它的执行,它就不再存在了。

要获得other Deck的浅拷贝,您应该将来自other实例的对cards字段的引用分配给正在创建的副本的cards字段。

浅拷贝构造函数可以是:

代码语言:javascript
复制
public Deck(Deck other) {
   cards = other.cards;
}   

但是,它不是ArrayList的浅表副本,正如您在问题标题中所问的那样,因为原始和复制中的cards字段都指向同一个对象。

若要拥有带有ArrayList浅副本的浅副本构造函数,可以执行以下操作:

代码语言:javascript
复制
public Deck(Deck other) {
   cards = new ArrayList<Card>(other.cards);
}   

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

代码语言:javascript
复制
public Deck(Deck other) {
   cards = other.cards.clone();
}  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40683670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档