toString() 方法的作用是 将一个 Java 对象转换成其字符串表示形式,以便于人们阅读和显示。

详细解释
toString() 的定义和来源
在 Java 中,toString() 是 Object 类中的一个方法,这意味着每一个 Java 对象都天生拥有这个方法,因为它位于所有类的继承链顶端。
Object 类中 toString() 的原始定义是这样的:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
如果你直接打印一个对象,System.out.println(myObject);,JVM 内部会自动调用这个对象的 toString() 方法,然后将返回的字符串打印出来。
举个例子:

class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
Person p = new Person("张三", 30);
System.out.println(p); // 这里会自动调用 p.toString()
}
}
运行这段代码,你会得到类似这样的输出:
com.example.Person@15db9742
这个输出是什么意思?
com.example.Person: 对象的类全名(getClass().getName())。- 一个固定的分隔符。
15db9742: 对象哈希码的十六进制表示(Integer.toHexString(hashCode()))。
这个默认的输出对于我们理解对象的内容几乎没有任何帮助,它只是一个对象的“身份标识”,主要用于调试和区分不同的对象实例。
为什么需要重写 toString()?
因为默认的 toString() 输出不直观,我们通常希望它能打印出对象有意义的、可读的信息,比如一个 Person 对象,我们希望它打印出 "Person{name='张三', age=30}" 这样的形式。

这就需要重写(Override) toString() 方法。
重写后的好处:
- 调试和日志记录:在开发过程中,打印对象时能立即看到其内部状态,极大地方便了调试。
- 提高代码可读性:当你需要将对象信息展示给用户(在列表中显示)时,一个格式良好的字符串表示非常有用。
- 集成在框架和工具中:很多 Java 框架和工具(如日志框架、调试器、测试库)在打印对象时,都会依赖这个方法来获取对象的字符串描述。
如何正确地重写 toString()?
重写 toString() 的最佳实践是:返回一个包含对象关键状态信息的、格式清晰、易于阅读的字符串。
字符串会包含对象的类名和各个重要字段的值。
示例:
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 重写 toString() 方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Main {
public static void main(String[] args) {
Person p = new Person("李四", 25);
System.out.println(p); // 现在会调用我们重写的 toString()
}
}
运行结果:
Person{name='李四', age=25}
这个输出就非常清晰了,一眼就能看出对象的内容。
小技巧: 现代开发工具(如 IntelliJ IDEA)可以一键生成 toString() 方法,只需在类中右键 -> Generate -> toString(),然后选择要包含的字段即可。
toString() 的实际应用场景
场景1:调试
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
System.out.println("当前列表内容: " + names); // ArrayList 类重写了 toString()
输出: [Alice, Bob, Charlie] 如果ArrayList没有重写toString(),输出将是类似java.util.ArrayList@1b6d3586` 的无意义信息。
场景2:日志记录
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
class Order {
private String orderId;
private double amount;
// ... 构造函数和 getter/setter ...
@Override
public String toString() {
return "Order{" +
"orderId='" + orderId + '\'' +
", amount=" + amount +
'}';
}
}
public class Application {
private static final Logger logger = LoggerFactory.getLogger(Application.class);
public void processOrder(Order order) {
logger.info("正在处理订单: {}", order); // 日志框架会自动调用 order.toString()
}
}
日志会输出:INFO - 正在处理订单: Order{orderId='ORD-12345', amount=99.99}
场景3:打印集合中的对象
List<Product> products = new ArrayList<>();
products.add(new Product("Laptop", 1200));
products.add(new Product("Mouse", 25));
// Product 类重写了 toString(),输出会很清晰
System.out.println(products);
// 输出: [Product{name='Laptop', price=1200.0}, Product{name='Mouse', price=25.0}]
| 方面 | 描述 |
|---|---|
| 来源 | Object 类的默认方法,所有 Java 对象都继承。 |
| 默认行为 | 返回 类名@哈希码 的形式,如 com.example.MyClass@1a2b3c4d。 |
| 核心作用 | 将对象转换为人类可读的字符串表示。 |
| 为什么重写 | 默认输出无意义,重写后便于调试、日志记录和用户展示。 |
| 如何重写 | 返回一个包含对象关键状态信息的格式化字符串。 |
| 最佳实践 | 使用 @Override 注解,并让 IDE 辅助生成。 |
| 应用场景 | 调试、日志、打印集合、UI 显示等任何需要对象文本表示的地方。 |
toString() 是 Java 对象与外部世界进行文本沟通的桥梁。重写它是成为一名合格 Java 程序员的基本功之一。
