首页 > 编程笔记 > Java笔记 阅读:17

Java toString()的用法(附带实例)

Java 中的每个类都直接或间接地扩展了类 Object。当类没有显式超类时,它其实隐式扩展了 Object。

Object 类定义了一些适用于任何 Java 对象的方法,如下表所示:

表:java.lang.Object 类的方法
方法 功能描述
String toString() 生成此对象的字符串表示形式,默认情况下为类名和哈希码
boolean equals(Object other) 如果此对象被认为等于 other,则返回 true;如果与 other 不同或 other 为 null,则返回 false。默认情况下,如果两个对象相同,则它们相等。考虑空安全问题建议使用Objects.equals(obj, other),而不是obj.equals(other)
int hashCode() 生成此对象的哈希码。相等对象必须具有相同的哈希码。除非被覆盖,否则虚拟机会以某种方式分配哈希码
ClassgetClass() 生成描述该对象所属类的 Class 对象
protected Object clone() 复制此对象。默认情况下,副本是浅拷贝的
protected void finalize() 当垃圾收集器回收此对象时,将会调用此方法。不要覆盖它

toString 是 Object 类中的一个重要方法,该方法返回对象的字符串描述。

例如,Point 类的 toString() 方法返回一个这样的字符串:
java.awt.Point[x=10, y=20]
许多 toString() 方法遵循以下格式:首先是类名,随后是一对方括号括起来的实例变量。

下面是 Employee 类中的 toString 方法的实现:
public String toString() {
    return getClass().getName() + "[name=" + name + ",salary=" + salary + "]";
}
这里通过 getClass().getName() 的形式进行方法调用,而不是硬连接字符串"Employee",这样可以保证该方法对子类也是正确的。

在子类中,调用 super.toString(),并在一对单独的括号中添加子类的实例变量:
public class Manager extends Employee {
   ...
   public String toString() {
      return super.toString() + "[bonus=" + bonus + "]";
   }
}

每当对象与字符串拼接时,Java 编译器都会自动调用对象上的 toString() 方法。例如:
var pos = new Point(10, 20);
String message = "The current position is " + pos;
// Concatenates with pos.toString()

可以写 "" + x ,来代替 x.toString()。如果 x 为 null 或是基本类型的值,这个表达式也可以工作。


Object 类定义了 toString() 方法来打印类名和哈希码。例如以下调用会生成一个类似 java.io.PrintStream@2f6684 的输出:
System.out.println(System.out)
因为 PrintStream 类的实现者不愿意覆盖 toString() 方法。

注意,数组继承了 Object 中的 toString() 方法,但它会以一种过时的格式打印出数组类型。例如,如果你有一个数组:
int[] primes = { 2, 3, 5, 7, 11, 13 };
然后,primes.toString() 将会生成类似 "[I@1a46e30" 的字符串。前缀 [I 表示整数数组。

补救方案是调用 Arrays.toString(primes) 来代替,这样会生成字符串 "[2, 3, 5, 7, 11, 13]"。要正确打印多维数组(即数组的数组),需要使用 Arrays.deepToString。

相关文章