Java遍历Card对象ArrayList时仅输出对象引用而非属性值怎么办
问题根因
你看到的com.company.Card@4517d9a3不是对象引用地址,是Java中所有类的顶层父类Object自带的toString()方法的默认返回值,格式固定为类全限定名@对象哈希码的十六进制字符串。
这个问题和你用迭代器遍历还是普通for循环遍历没有关系,核心原因是你自定义的Card类没有重写toString()方法。当你调用String.valueOf(iterator.next())做类型转换时,本质会调用Card对象的toString()方法拿到字符串表示,没有重写的情况下就会返回默认格式的内容。
解决方案
二选一即可:
方案1:重写Card类的toString()方法(推荐)
在Card类中新增重写的toString()方法,自定义需要展示的花色、点数属性拼接规则,之后所有打印Card对象的场景都会自动输出你定义的内容,不需要修改遍历逻辑。
修改后的Card类代码如下:
public class Card { private CardSuit cardSuit; private CardValue cardValue; public Card(CardSuit cardSuit, CardValue cardValue) { this.cardValue = cardValue; this.cardSuit = cardSuit; } public CardValue getCardValue() { return cardValue; } public CardSuit getCardSuit() { return cardSuit; } // 新增重写的toString方法 @Override public String toString() { // 输出格式可根据需求自定义,比如调整为"红桃A"这类可读格式 return cardSuit + " " + cardValue; } }
补充说明:如果CardSuit、CardValue是自定义枚举/类,也需要保证它们的toString()返回的是可展示的文本内容,否则这两个字段还是会输出默认的类名+哈希值格式。
方案2:打印时手动拼接属性(不修改Card类)
如果你不想改动Card类的原有代码,就不要直接转换整个Card对象为字符串,在遍历时手动调用getter方法拿到花色、点数属性,拼接成需要的格式再打印。
修改后的showCards方法:
public static void showCards(ArrayList<Card> cards){ // 建议给迭代器加上泛型,避免类型转换风险 Iterator<Card> iterator = cards.iterator(); while(iterator.hasNext()){ Card card = iterator.next(); // 自定义输出格式 String printContent = card.getCardSuit() + " " + card.getCardValue(); System.out.println(printContent); } }
内容的提问来源于stack exchange,提问作者megabyt
相关产品推荐
相关产品推荐

