toString()方法是Java中Object类的标准方法,允许获取对象的字符串表示。历史上,它的引入是为了帮助调试和记录日志,以便能够得到有意义且可读的描述,而不是输出关于对象的技术信息(如ClassName@hashCode)。
最初,如果没有重写toString(),该方法返回类似于类名@哈希码的字符串。这对理解或输出对象状态并不方便。因此,重写toString()已成为良好的实践。
没有明显实现的toString(),对象的调试和日志记录会变得复杂。很难了解对象中究竟包含了什么,而不知道其内部结构或当前字段的值。
正确重写toString()可以:
代码示例:
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 + "}"; } }
关键特点:
是否必须在所有类中始终重写toString()方法?
不,虽然不是强制性的,但在对象频繁记录日志或用于调试的类中重写它是非常希望的。
toString()方法可以抛出异常吗?
从技术上讲,可以,如果在方法内部访问字段时出现如NullPointerException而未检查null。但良好的实践是避免这种情况,以便toString()始终返回有效字符串。
调用toString()是否显式是必需的?
不,编译器会在将对象与字符串连接或通过System.out.println输出对象时隐式调用它。
Person p = new Person("Ivan", 25); System.out.println(p); // 自动调用p.toString()
程序员在User类中不重写toString()并在日志中写道:
log.info(user);
优点:
缺点:
User@1a2b3c,没有用户信息。程序员重写toString():
@Override public String toString() { return "User{name='" + name + "', id=" + id + "}"; }
优点:
缺点: