必须重写tostring()方法才能让打印子类对象时显示有意义的属性信息;可通过手动覆盖、ide生成或lombok@tostring注解实现,需注意避免异常、副作用及空指针,并遵循清晰可读的字符串格式。

Java中默认的Object.toString()方法只返回类名加哈希码(如ClassName@hashcode),无法显示子类的具体属性。要让打印子类对象时显示有意义的属性信息,必须**重写toString()方法**。
重写 toString 方法(最常用)
在子类中显式覆盖toString(),手动拼接需要展示的字段值:
- 用
@Override注解确保正确覆盖 - 返回字符串格式建议清晰、可读,例如
"Person{name='张三', age=25}" - 注意判空,避免
NullPointerException(尤其对引用类型字段)
示例:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
调用System.out.println(new Person("李四", 30))会输出:Person{name='李四', age=30}
使用工具类自动生成(推荐开发阶段)
手动拼接易出错、维护成本高。IDE(如IntelliJ IDEA、Eclipse)支持一键生成toString():
- IntelliJ:右键 → Generate → toString() → 勾选所需字段
- 也可用Lombok库,加
@ToString注解,编译时自动注入实现
使用Lombok示例:
@ToString
public class Person {
private String name;
private int age;
}
效果等同于手写,且随字段增减自动更新。
避免常见陷阱
重写时容易忽略的关键点:
- 不要在
toString()中调用可能抛异常或耗时的方法(如数据库查询、IO操作) - 不要在其中修改对象状态(
toString()应是纯函数,无副作用) - 若类有继承关系,父类已重写
toString(),子类可选择调用super.toString()再追加自身字段
调试时临时查看属性(非正式方案)
开发调试阶段,可用Objects.toString()或JSON序列化快速查看:
-
System.out.println(Objects.toString(person));—— 仍依赖对象是否重写了toString() - 用
Gson或Jackson转成JSON:new Gson().toJson(person),直观但不适用于生产环境频繁调用
这类方式适合临时排查,不能替代规范的toString()重写。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











