Java toString()的用法(附带实例)
Java 中的每个类都直接或间接地扩展了类 Object。当类没有显式超类时,它其实隐式扩展了 Object。
Object 类定义了一些适用于任何 Java 对象的方法,如下表所示:
toString 是 Object 类中的一个重要方法,该方法返回对象的字符串描述。
例如,Point 类的 toString() 方法返回一个这样的字符串:
下面是 Employee 类中的 toString 方法的实现:
在子类中,调用 super.toString(),并在一对单独的括号中添加子类的实例变量:
每当对象与字符串拼接时,Java 编译器都会自动调用对象上的 toString() 方法。例如:
Object 类定义了 toString() 方法来打印类名和哈希码。例如以下调用会生成一个类似 java.io.PrintStream@2f6684 的输出:
注意,数组继承了 Object 中的 toString() 方法,但它会以一种过时的格式打印出数组类型。例如,如果你有一个数组:
补救方案是调用 Arrays.toString(primes) 来代替,这样会生成字符串 "[2, 3, 5, 7, 11, 13]"。要正确打印多维数组(即数组的数组),需要使用 Arrays.deepToString。
Object 类定义了一些适用于任何 Java 对象的方法,如下表所示:
方法 | 功能描述 |
---|---|
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。