12.2 方法toString

创建新类的第一步是声明实例变量和编写构造函数。接下来该干什么呢?一种不错的选择是编写方法 toString,这对调试和渐进开发大有帮助。

要想以易于阅读的方式显示 Card 对象,需要将整数编码映射到字符串。为此,一种比较自然的方式是使用一个 String 数组。我们可以像下面这样创建这个数组:

  1. String[] suits = new String[4];

然后给每个元素赋值:

  1. suits[0] = "Clubs";
  2. suits[1] = "Diamonds";
  3. suits[2] = "Hearts";
  4. suits[3] = "Spades";

我们也可像 8.3 节那样,在创建数组的同时初始化元素:

  1. String[] suits = {"Clubs", "Diamonds", "Hearts", "Spades"};

图 12-1 所示的状态图显示了结果。每个元素都是一个指向 String 的引用。

12.2 方法toString - 图1

图 12-1:一个字符串数组的状态图

我们还需要一个对点数进行解码的数组:

  1. String[] ranks = {null, "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"};

有效的点数为 1~13,因此根本不会用到索引为 0 的元素。我们将它设置为 null,表明这个元素不会被用到。

通过将实例变量 suitrank 用作索引,可从这些数组中提取有意义的字符串。

  1. String s = ranks[card.rank] + " of " + suits[card.suit];

表达式 suits[card.suit] 表示将对象 card 的实例变量 suit 用作索引,以访问数组 suits 中的相应元素。

现在可以将这些代码封装到方法 toString 中了:

  1. public String toString() {
  2. String[] ranks = {null, "Ace", "2", "3", "4", "5", "6",
  3. "7", "8", "9", "10", "Jack", "Queen", "King"};
  4. String[] suits = {"Clubs", "Diamonds", "Hearts", "Spades"};
  5. String s = ranks[this.rank] + " of " + suits[this.suit];
  6. return s;
  7. }

当我们显示 Card 对象时,println 将自动调用 toString

  1. Card card = new Card(11, 1);
  2. System.out.println(card);

输出为 Jack of Diamonds