1、为什么要覆盖toString?
java.lang.Object的toString方法的实现:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
这通常不是用户期望看到的,它返回的是类名称+“@”符号+无符号十六进制的散列码。
举例:定义一个Person类
public class Person {
private String name;
private int age;
private boolean sex;
public Person(String name, int age, boolean sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
//通过比较name来判断是否为同一对象
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Person))
return false;
return name.equals(((Person) obj).name);
}
//返回name的hashcode
@Override
public int hashCode() {
return name.hashCode();
}
public static void main(String[] args){
Person person = new Person("John", 21, true);
List<Person> list = new ArrayList<>();
list.add(person);
System.out.println("current Person: " + list.get(0).toString());
}
}
打印输出:current Person: toString_demo.Person@23512b。
提供好的toString实现可以使类用起来更加舒适,当对象被传递给println、printf、字符串联操作符(+)以及assert或者被调试器打印出来时,toString方法会被自动调用。
2、如何覆盖toString操作?
举例:对于上面的person类
@Override
public String toString() {
return "\nname: " + name + "\nage: " + age + "\nsex: " + sex;
}
这样,如果我们要获取到person类的信息,如此调用即可:
System.out.println("current Person: " + list.get(0).toString());
3、两个建议:
1.无论是否决定指定格式,都应该在文档中明确地表明意图,通过文档注释来说明。
2.无论是否指定格式,都为toString返回值中包含的所有信息,提供一种编程式的访问途径,如使用getter方法提供。否则程序员必须去解析字符串,而这会导致大量不必要的工作量和增加程序出错的可能性。