一、基础定位toString() 是谁的方法toString()是Object 类中定义的实例方法所有 Java 对象都默认继承该方法。publicStringtoString()Object 是所有类的根父类因此任何自定义类、系统类String、ArrayList、Integer等都自带 toString()。1. Object 原生 toString() 默认实现源码publicStringtoString(){returngetClass().getName()Integer.toHexString(hashCode());}输出格式类名对象哈希值十六进制示例com.demo.User1b6d35862. 默认 toString() 的问题打印对象时如果不重写只会输出一串无意义地址字符串无法直观看到对象内部数据所以业务开发几乎都要重写 toString()。二、什么时候会自动调用 toString()无需手动.toString()场景会自动触发System.out.println(对象)/System.out.print(对象)字符串拼接用户信息 user调试打印日志log.info(user)集合打印System.out.println(list)内部遍历元素自动调用toString示例UserusernewUser(1,张三);System.out.println(user);// 自动执行 user.toString()Stringinfo用户user;// 自动调用toString拼接三、重写 toString() 的规范与写法核心作用自定义输出格式打印对象时直接展示成员变量值方便调试、日志排查。标准重写模板1. 手动手写版通用classUser{privateIntegerid;privateStringname;// 构造器publicUser(Integerid,Stringname){this.idid;this.namename;}// 重写toStringOverridepublicStringtoString(){returnUser{idid, namename\};}}调用打印UserunewUser(1001,李四);System.out.println(u);// 输出User{id1001, name李四}2. IDE自动生成开发最常用IDEA / Eclipse 一键生成 toStringIDEAAlt Insert→ 选择toString()→ 勾选需要输出的字段自动生成规范代码。3. Lombok 简化项目常用添加注解ToString不用手写重写代码importlombok.ToString;ToStringclassUser{privateIntegerid;privateStringname;}缺点底层反射生成简单项目够用高性能框架慎用。四、重写 toString() 的注意事项必须加 Override 注解防止方法名拼写错误比如写成tostring小写编译器会报错提示。空值处理字段为 null 时拼接不会报错字符串会显示null无需额外判空。循环引用问题A类包含B对象B类又包含A对象toString 互相调用会栈溢出 StackOverflowError。解决重写时忽略循环引用字段。不要在 toString 中写复杂业务逻辑toString 频繁自动调用复杂计算、IO、数据库查询会严重拖慢程序。输出格式建议固定使用类名{字段1值1, 字段2值2}标准格式日志可读性统一。五、包装类、集合的 toString 实现对比Java 内置类都已经重写好 toString直接打印即可看到内容基本类型包装类Integernum123;System.out.println(num);// 123StringStringshello;System.out.println(s);// helloArrayListListStringlistnewArrayList();list.add(A);list.add(B);System.out.println(list);// [A, B]自定义类不重写UserunewUser(1,张三);System.out.println(u);// User4554617c六、toString() 与 String.valueOf()、对象转字符串区别对象.toString()对象不能为 nullnull 调用直接抛NullPointerException。String.valueOf(对象)安全方法对象为 null 时返回字符串null底层实现publicstaticStringvalueOf(Objectobj){return(objnull)?null:obj.toString();}开发推荐优先用String.valueOf()避免空指针。七、进阶toString() 与 StringBuilder 优化拼接字符串拼接底层会频繁创建 String 对象重写 toString 字段多时建议用StringBuilder提升性能OverridepublicStringtoString(){returnnewStringBuilder(User{).append(id).append(id).append(, name).append(name).append(\).append(}).toString();}八、常见面试考点总结toString() 属于哪个类Object 类所有对象都继承。默认 toString 输出什么类名哈希十六进制。为什么要重写 toString方便日志、调试查看对象属性。null 对象调用 toString 会报什么错NullPointerException可用 String.valueOf 规避。重写 toString 不加 Override 会怎样方法名写错编译器不会提示运行还是调用父类默认方法。循环引用重写 toString 会出现什么异常StackOverflowError 栈溢出。完整可运行示例publicclassToStringDemo{publicstaticvoidmain(String[]args){// 未重写toStringObjNoRewriteobj1newObjNoRewrite();System.out.println(未重写obj1);// 重写toStringStudentstunewStudent(2026001,小明,18);System.out.println(重写后stu);}}// 未重写toStringclassObjNoRewrite{}// 重写toStringclassStudent{privateLongstuId;privateStringname;privateIntegerage;publicStudent(LongstuId,Stringname,Integerage){this.stuIdstuId;this.namename;this.ageage;}OverridepublicStringtoString(){returnStudent{学号stuId, 姓名name\, 年龄age};}}运行输出未重写ObjNoRewrite1b6d3586 重写后Student{学号2026001, 姓名小明, 年龄18}