Java中重写toString方法以正确打印自定义对象内容

当使用system.out.println()输出自定义类(如banking)实例时,默认调用object类的tostring()方法,导致显示内存地址(如banking@7852e922);需在类中重写tostring()方法,返回可读字符串。

在Java中,所有类都隐式继承自java.lang.Object,而其默认的toString()方法仅返回类名加“@”符号及哈希码十六进制表示(例如org.encap.Banking@7852e922)。这正是你在控制台看到“内存地址”格式输出的根本原因——并非Map或LinkedHashMap的问题,而是Banking对象未提供有意义的字符串表示

要解决该问题,只需在Banking类中显式重写toString()方法。推荐使用@Override注解确保正确覆盖,并按业务逻辑组织字段输出。以下是优化后的Banking.java:

package org.encap;

public class Banking {
    private int username;
    private String password;

    // Getters and Setters (unchanged)
    public int getUsername() {
        return username;
    }

    public void setUsername(int username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    // ✅ Critical: Override toString() for human-rea

dable output @Override public String toString() { return "Banking{" + "username=" + username + ", password='" + password + '\'' + '}'; } }

完成修改后,再次运行Website类,输出将变为:

Banking{username=111, password='Password'}
Banking{username=222, password='Password2'}
[Banking{username=111, password='Password'}, Banking{username=222, password='Password2'}]
[1=Banking{username=111, password='Password'}, 2=Banking{username=222, password='Password2'}]

关键注意事项:

  • toString() 方法应只用于调试和日志展示,不建议包含敏感信息(如明文密码),生产环境可脱敏处理(例如显示 "password='***'");
  • 若使用IDE(如IntelliJ IDEA或Eclipse),可通过右键 → GeneratetoString() 快速生成标准实现;
  • 对于复杂对象或嵌套结构,可结合Objects.toString()或第三方库(如Apache Commons Lang的ToStringBuilder)提升可维护性;
  • Map.values() 和 Map.entrySet() 的输出也依赖其中值(即Banking对象)的toString()实现,因此重写一次即可全局生效。

通过这一改动,你不仅解决了当前LinkedHashMap输出不可读的问题,也为后续调试、单元测试和日志记录打下了坚实基础。