Java如何调用类get方法正确打印自定义Card类型Deck数组
问题根因
直接打印对象输出全类名@十六进制哈希串是Java的默认行为:所有类默认继承顶层Object类,打印对象时会自动调用Object类的toString()方法,该方法的默认实现就是返回上述格式的字符串。你打印Deck实例得到Deck的哈希串、打印Card实例得到Card的哈希串,核心原因是没有重写对应类的toString()方法。
另外你的代码存在基础逻辑错误:Card类的构造方法没有使用传入的value和suit参数给成员变量赋值,所有实例化的Card对象默认值都是0、花色为空字符串,即使解决了打印哈希的问题,也无法得到正确的牌面内容。
修复方案
1. 修复Card类逻辑,重写toString方法
首先修正构造方法的赋值逻辑,再重写toString()返回牌值、花色的可读内容,不需要额外写自定义打印方法:
package jamilzin.cassino; public class Card { private String suit; private int value; // 修正构造方法:将传入参数赋值给成员变量 public Card(int value, String suit){ this.value = value; this.suit = suit; } public String getSuit() { return suit; } public void setSuit(String suit) { this.suit = suit; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } // 重写toString,返回可读的牌面信息 @Override public String toString() { // 可自行调整格式,比如将1/11/12/13映射为A/J/Q/K return value + " - " + suit; } }
2. 给Deck类重写toString方法,遍历内部Card数组拼接内容
由于存储Card对象的deck数组是私有成员,直接在Deck的toString()方法中遍历数组、拼接所有牌的内容即可。如果需要外部获取数组单独处理,可以额外加一个getter方法:
package jamilzin.cassino; import java.util.Arrays; import java.util.Random; public class Deck { private Card[] deck; private String[] suits = {"Ouro", "Paus", "Espada", "Copas"}; private Random gerador = new Random(); public Deck(){ deck = new Card[52]; int k = 0; for(int j = 0; j< suits.length;j++){ for(int i = 0;i< 13;i++){ deck[k] = new Card((i+1),suits[j]); k++; } } } // 重写Deck的toString,返回整副牌的可读内容 @Override public String toString() { StringBuilder deckContent = new StringBuilder(); deckContent.append("整副牌内容:\n"); for (Card card : deck) { // 直接拼接card对象时,会自动调用Card重写后的toString方法 deckContent.append(card).append("\n"); } return deckContent.toString(); } // 可选:提供getter方法供外部获取Card数组自行处理 public Card[] getDeck() { // 返回数组副本,避免外部随意修改内部存储的牌组 return Arrays.copyOf(deck, deck.length); } }
3. 测试类直接打印Deck实例即可
原有测试逻辑不需要额外修改,直接打印Deck实例就会输出格式化后的牌组内容,不会再出现哈希串:
package jamilzin.cassino; public class Cassino { public static void main(String[] args) { Deck deckMaster = new Deck(); System.out.println(deckMaster); } }
其他实现方式
如果你不想重写toString()方法,也可以在获取到Card数组后,手动遍历调用getValue()和getSuit()方法打印,效果一致:
Card[] cards = deckMaster.getDeck(); for (Card card : cards) { System.out.println(card.getValue() + " " + card.getSuit()); }
重写toString()的优势是后续需要打印对象时不需要重复写遍历拼接逻辑,直接传入打印方法即可输出可读内容。
内容的提问来源于stack exchange,提问作者ffffffff
相关产品推荐
相关产品推荐

