参考链接: 在Java中重写toString()
前言: 在你兴高采烈的写完一个类,创建测试类时,创建对象,传入参数,调用对象,以为会得到参数值,但突然发现输出的是“ 类名@什么东东?(其实是散列码,也是16进制的哈希值哈)”,反复检查代码,但不知怎么修改。我不知道你们有没有这种情况发生,但是我经常就有,原因当然是因为不习惯重写toString方法和基础知识还不足导致的啦。还是要加油呀!所以记录一下学习的toString()方法。
1.1 在Object类中有一个重要的方法:toString()方法。
作用:用于返回表示对象值的字符串
1.2 为啥要重写toString方法呢?
Object类中的toString方法返回的是什么呢?我们打开toString源码发现:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
返回的字符串是:类名@散列码。 那为什么其它类的对象返回的也是这样的形式呢?因为所有的类的超类都是Object类。(可在类中按住ctrl+t查看继承关系)
例如: 创建一个People类:
public class People {
private String name;
private int age;
public People(String name,int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
测试类:
/**
* toString方法的调用
* @懒惰的小黑
*
*/
public class toStringTest {
public static void main(String[] args) {
People p = new People("懒惰的小黑",20);
System.out.println(p); //p会自动调用toString方法
System.out.println(p.toString()); //手动调用
}
}
执行结果: com.xiaohei.text.People@279f2327 com.xiaohei.text.People@279f2327
但是你想输出的并非是这样的结果,而是想输出对象的具体描述(name和age),所以需要在类中重写toString方法。 重写toString方法:
public String toString() {
return "[name = " + getName() + ",age = "+ getAge() + "]";
}
测试:
People p = new People("懒惰的小黑",20);
System.out.println(p); //p会自动调用toString方法
执行结果: [name = 懒惰的小黑,age = 20]
实际上,还可以设计的更好一些。最好通过getClass().getName() + 类的描述:获取类名的字符串(地址)+类的描述。 例:
public String toString() {
return getClass().getName() + "[name = " + getName() + ",age = "+ getAge() + "]";
}
测试: 同上例 执行结果: com.xiaohei.text.People[name = 懒惰的小黑,age = 20]
注意: 此处的getClass().getName()中的getName并非People类中的getName方法!
1.3 toString方法也可供子类使用,子类只需调用super.toString()。
例如: 创建子类:
class Teachers extends People{
private int salary;
public Teachers(String name, int age,int salary) {
super(name, age);
this.salary = salary;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public String toString() {
return super.toString() + ",salary = " + getSalary();
}
}
测试:
public class toStringTest {
public static void main(String[] args) {
Teachers t = new Teachers("懒惰的小黑",20,5000);
System.out.println(t);
}
}
执行结果: [name = 懒惰的小黑,age = 20],salary = 5000
1.4 数组类型调用toString()方法
数组继承了Object类中的toString方法,数组类型会按旧格式打印。
例如:
public class ArraytoStringTest {
public static void main(String[] args) {
int[] a = {5,6,2,1,3};
System.out.println(a); //自动调用toString方法
执行结果:[I@1f32e575 注:[I 表明是一个整形数组。
所以我们需要调用Array.toString 方法 例如:
import java.util.Arrays;
public class ArraytoStringTest {
public static void main(String[] args) {
int[] a = {5,6,2,1,3};
String a1 = Arrays.toString(a);
System.out.println(a1);
}
}
执行结果:[5, 6, 2, 1, 3]
说明:为什么会出现这种形式呢?按住ctrl点击toString方法,查看源码:
public static String toString(int[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
注意:打印多维数组则需调用Arrays.deepToString()方法
总结提醒:建议类中都要重写toString方法,方便后面程序员的调用!