
当直接打印自定义对象(如Dog或Monkey)列表时,Java默认调用Object类的toString()方法,输出形如Dog@42a57993的哈希码;解决方法是在每个实体类中重写toString()方法,返回可读的字符串表示。
当直接打印自定义对象(如dog或monkey)列表时,java默认调用object类的tostring()方法,输出形如`dog@42a57993`的哈希码;解决方法是在每个实体类中重写tostring()方法,返回可读的字符串表示。
在Java中,所有类都隐式继承自Object类,而Object.toString()的默认实现仅返回类名 + @ + 对象哈希码的十六进制字符串(例如 Dog@42a57993)。当你执行 System.out.println(dogList) 时,ArrayList 的 toString() 方法会依次调用每个元素的 toString() —— 如果 Dog 和 Monkey 类未重写该方法,就会看到一串难以理解的内存地址式输出。
✅ 正确做法:在 Dog.java 和 Monkey.java 中分别添加清晰、规范的 toString() 方法,并使用 @Override 注解确保重写有效:
// Dog.java 中添加如下方法
@Override
public String toString() {
return String.format("Dog{name='%s', breed='%s', gender='%s', age='%s', weight='%s', status='%s', reserved=%b, country='%s'}",
name, breed, gender, age, weight, trainingStatus, reserved, inServiceCountry);
}
// Monkey.java 中添加如下方法
@Override
public String toString() {
return String.format("Monkey{name='%s', species='%s', gender='%s', age='%s', weight='%s', tailLength='%s', height='%s', bodyLength='%s', status='%s', reserved=%b, country='%s'}",
name, species, gender, age, weight, tailLength, height, bodyLength, trainingStatus, reserved, inServiceCountry);
}
? 关键注意事项:
- ✅ 必须使用
@Override注解:它能帮助编译器校验方法签名是否匹配父类(Object.toString()),避免因拼写错误(如tostring或toString(String))导致重写失败; - ✅ 返回值必须是非空字符串:返回
null会导致NullPointerException(尤其在System.out.println()或ArrayList.toString()内部调用时); - ✅ 避免在
toString()中抛出异常或执行耗时操作(如I/O、网络请求),它应是轻量、纯文本格式化逻辑; - ✅ 若类有继承关系(如
Monkey继承自Animal),建议在子类toString()中调用super.toString()并补充特有字段,提升可维护性。
? 补充优化建议(提升可读性):
你当前的 printAnimals(char option) 方法直接打印整个列表(System.out.println(dogList)),虽能工作,但格式较紧凑。如需更美观的逐行输出,可改用增强for循环:
else if (option == '4') {
System.out.println("\n=== All Dogs ===");
for (Dog dog : dogList) {
System.out.println(dog); // 自动触发重写的 toString()
}
}
这样不仅解决了十六进制问题,还让输出结构更清晰、便于用户阅读和调试。重写 toString() 是Java面向对象开发中的基础实践,也是调试与日志输出可靠性的关键保障。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











