2024-10-24 07:57:31
首先回顾一下提问者的问题吧。
提问者定义了这样一个类:
然后创建了一个该类的对象,并尝试打印它:
但是输出的结果并不是他想要的:
除此之外,他在打印数组的时候也出现了相似的问题:
输出结果为:
这些输出结果由 Java 对象默认的 toString() 方法产生,该方法返回一个包含对象类名、哈希码的字符串。让我们深入了解这个方法。
所有的 Java 对象都默认附带了一个 toString() 方法,当我们尝试打印这个对象的时候,该方法就会被调用。该方法由 Object 类(所有 Java 对象的超类)定义,返回一个看起来晦涩难懂的字符串,由以下部分组成:
数组和普通的 Java 对象类似,只有一点不同——追踪 Class 类的 getName() 方法可以印证这一点。如果是一个数组的话,Class 名的前面会有一个或者多个英文中括号“[”,表示数组的维度(一维数组为一个“[”,二维数组为两个“[”),然后再紧跟一个元素的类型首字母。这就是为什么对象数组的前缀是 “[L” 的原因。
如果想在打印的时候输出自己预期的结果,就必须在自定义类中重写 toString() 方法。通过重写,我们可以控制输出的格式,从而更优雅地展示对象信息。
在示例中,我们展示了如何重新定义 toString() 方法,使得打印 Cmower 对象时输出结果更为清晰且美观。我们还可以定义一个新的方法,如 toMyString() 方法,保留原始打印格式的同时打印对象信息。
对于 IDE(如 Eclipse 或 IntelliJ IDEA)通常提供针对类的字段的输出格式,以覆盖 toString() 方法。此外,一些开源的第三方类库如 Apache Commons Lang 的 ToStringBuilder、Google Guava 的 MoreObjects、以及 Lombok 的 @toString 注解提供这样的功能,使得输出对象信息变得更加便捷。
在处理对象列表(数组或集合)时,我们可以通过 Java 的内置方法来自动化输出。例如,使用 Arrays.toString() 方法可以将任意类型的数组转成字符串,包括基本类型数组和引用类型数组。而直接打印集合通常就能输出我们预期的结果,无需额外的代码。
总结以上内容,我们不仅了解了如何优雅地打印 Java 对象,还讨论了如何处理对象列表。在实际开发中,合理利用这些技术可以显著提升代码的可读性和调试效率。