13.1 Deck

本章的主要目标是创建一个 Deck 类,用来封装一个 Card 对象数组。这个类的初始定义类似于下面这样:

  1. public class Deck {
  2. private Card[] cards;
  3. public Deck(int n) {
  4. this.cards = new Card[n];
  5. }
  6. }

其中的构造函数将实例变量初始化为一个包含 nCard 对象的数组,但没有创建任何 Card 对象。图 13-1 显示了不包含任何 Card 对象的 Deck 对象是什么样的。

{%}

图 13-1:未填充的 Deck 对象的状态图

我们将添加另一个构造函数,让它创建一副标准牌(包含 52 张牌),并用 Card 对象填充它:

  1. public Deck() {
  2. this.cards = new Card[52];
  3. int index = 0;
  4. for (int suit = 0; suit <= 3; suit++) {
  5. for (int rank = 1; rank <= 13; rank++) {
  6. this.cards[index] = new Card(rank, suit);
  7. index++;
  8. }
  9. }
  10. }

这个方法类似于 12.6 节中的示例;我们只是将这个示例转换成了构造函数。现在可以像下面这样来创建一副标准的扑克牌:

  1. Deck deck = new Deck();

创建 Deck 类后,就可将与整副扑克牌相关的方法放在这个类中了。回顾前面编写的方法,应放在这个类中的方法显然是 12.6 节中的 printDeck

  1. public void print() {
  2. for (int i = 0; i < this.cards.length; i++) {
  3. System.out.println(this.cards[i]);
  4. }
  5. }

将静态方法转换为实例方法后,其代码通常会更短。要调用这个实例方法,只需要使用 deck.print() 即可。