Java实现持有Card列表属性的Deck类:报错解决与52张牌组构建
代码编译报错原因与修复方案
核心报错根源
- 继承关系定义错误:
Deck类不应继承Card类。二者是包含与被包含的组合关系,而非父子继承关系。Java子类构造方法执行时会默认调用父类的无参构造,由于Card类仅定义了Card(String name, Suit type)双参构造、不存在无参构造,因此触发Implicit super constructor Carta() is undefined报错,手动添加super()无法解决问题,因为不存在可调用的无参Card构造。 - 实例化对象遗漏关键字:构造方法中
this.deck.add(Card("two", Suit.CLUBS))未加*new*,编译器会将该代码识别为调用名为Card的普通成员方法,而非创建Card类实例,因此弹出Create method Card(String, Suit)的提示。
实现全52张牌组的完整可编译代码
1. 花色枚举定义
public enum Suit { SPADES, HEARTS, DIAMONDS, CLUBS }
2. 单张牌Card类
public class Card { private String name; private Suit type; public Card(String name, Suit type) { this.name = name; this.type = type; } @Override public String toString() { return name + " of " + type; } }
3. 修正后的牌组Deck类
import java.util.ArrayList; import java.util.List; public class Deck { public List<Card> deck = new ArrayList<>(); public Deck() { // 定义标准牌组的所有牌面名称 String[] cardNames = {"two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "jack", "queen", "king", "ace"}; // 遍历所有花色、所有牌面生成完整52张牌 for (Suit suit : Suit.values()) { for (String cardName : cardNames) { // 补充new关键字创建Card实例 this.deck.add(new Card(cardName, suit)); } } } public void printDeck() { for (Card card : deck) { System.out.println(card); } } }
关键修正说明
- 移除
Deck类对Card类的继承,采用组合关系建模:面向对象设计中,is-a关系适合用继承实现,has-a关系适合用成员属性实现。牌组(Deck)的核心特征是“持有多张飞牌”,完全匹配has-a的逻辑,该调整从根源上消除父类构造器缺失的编译报错。 - 所有实例化
Card类的代码前补充new关键字,明确告知编译器要创建类的实例对象,而非调用同名普通方法。 - 全量52张牌的生成采用嵌套遍历逻辑:一次遍历枚举的4种花色,一次遍历13种牌面名称,循环生成
Card实例加入牌组列表,避免逐行手写重复添加代码的冗余问题。
内容的提问来源于stack exchange,提问作者António Rocha Gonçalves
相关产品推荐
相关产品推荐

