
当 Java 对象(如 Dog 或 Monkey)直接被 System.out.println() 输出时,默认会显示类名加哈希码(如 Dog@42a57993),这是因未重写 toString() 方法;只需在对应类中添加带 @Override 注解的 toString() 方法,即可控制其字符串表示形式。
当 java 对象(如 dog 或 monkey)直接被 `system.out.println()` 输出时,默认会显示类名加哈希码(如 `dog@42a57993`),这是因未重写 `tostring()` 方法;只需在对应类中添加带 `@override` 注解的 `tostring()` 方法,即可控制其字符串表示形式。
在 Java 中,所有类都继承自 Object 类,而 Object.toString() 的默认实现返回的是 类名 + @ + 十六进制哈希码(例如 Dog@42a57993)。这正是你在菜单选项 4 和 5 中看到 [Dog@..., Dog@...] 的根本原因——System.out.println(dogList) 实际上调用了每个 Dog 对象的 toString(),而你的 Dog 和 Monkey 类尚未覆盖该方法。
✅ 正确做法:在 Dog 和 Monkey 类中重写 toString()
以 Dog 类为例,在类定义内部添加如下方法(注意必须使用 @Override 注解,确保编译器校验签名正确):
@Override
public String toString() {
return String.format("Dog{name='%s', breed='%s', gender='%s', age='%s', weight='%s', status='%s', reserved=%s}",
name, breed, gender, age, weight, trainingStatus, reserved);
}
同样地,为 Monkey 类补充:
@Override
public String toString() {
return String.format("Monkey{name='%s', species='%s', gender='%s', age='%s', weight='%s', tailLength='%s', height='%s', status='%s', reserved=%s}",
name, species, gender, age, weight, tailLength, height, trainingStatus, reserved);
}
? 提示:
String.format()可读性强、格式清晰;你也可用字符串拼接(如"Name: " + name + ", Breed: " + breed),但推荐前者以避免空指针和冗余+。
⚠️ 注意事项
-
必须添加
@Override:它不是可选装饰,而是强制要求方法签名与父类toString()完全一致(即public String toString()),否则编译不通过或无效。 -
不可返回
null:System.out.println(null)会输出null字符串,但若集合遍历时某对象toString()返回null,可能引发NullPointerException(尤其在日志或调试场景)。 -
字段访问权限:确保
toString()中引用的字段(如name,breed)是public或有对应getter方法(推荐后者)。例如,若name是私有字段,应调用getName()而非直接访问name。 - 一致性与实用性:返回的字符串应包含关键业务信息(如名称、状态、是否预留),便于调试和用户查看;避免过长或敏感信息(如密码)。
? 验证效果
完成重写后,再次运行程序并选择菜单项 4(打印狗列表)或 5(打印猴列表),输出将变为:
[Dog{name='Spot', breed='German Shepherd', gender='male', age='1', weight='25.6', status='intake', reserved=false},
Dog{name='Rex', breed='Great Dane', gender='male', age='3', weight='35.2', status='Phase I', reserved=false}]
而非原先难以理解的十六进制地址。
✅ 总结
toString() 是 Java 中最基础也最重要的可定制方法之一。它不仅影响控制台输出,还作用于日志记录、调试器显示、集合 toString()(如 ArrayList.toString())等所有隐式字符串转换场景。养成「只要自定义类需可读性输出,就立即重写 toString()」的习惯,是写出专业、可维护 Java 代码的关键一步。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











