You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:42:32