1、toString哪里来的?
toString方法在Object类中,Object是顶级父类,其他所有的类都可以对Object的方法进行覆盖重写
2、Object类中的toString(ctrl查看源码)
可以看出,Object类中的toString返回的是当前包名.类名@十六进制的地址值。也就是说,若子类不对toString进行覆盖重写,那么子类对象调用该方法返回的也是地址值。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
3、哪些常见类覆盖重写了toString?
(1)StringBuilder
返回值调用String有参构造,返回的最终结果是字符串
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
(2)Arrays
返回形式是用[]括起来的一组数据
public static String toString(Object[] 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(String.valueOf(a[i]));
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
(3)Integer(包装类)
返回的是内容为value的字符串
public String toString() {
return toString(value);
}
4、自定义的类也可以覆盖重写toString
(1)定义一个Student类,重写toString方法:
public class Student {
public String name;
public int age;
public String sex;
public String toString() {
return return "姓名:"+this.name+" 年龄:"+this.age+" 性别:"+this.sex;
}
}
主函数中调用:
System.out.println(new Student("小明",10,"男").toString();
输出结果:
(2)定义一个ToStringTest类,用StringBuilder进行拼接,重写该类的toString方法,输出结果为:I love java
public class ToStringTest{
public static void main(String args[]){
//System.out.println("love " + new ToStringTest());
//这一步可以拆解为以下步骤:
StringBuilder sb=new StringBuilder();
sb.append("love "); //拼上了,没打印
ToStringTest tst = new ToStringTest();
sb.append(tst);//实际上调用toStirng方法,先打印一个I,返回值是java,拼接到sb后面,sb里面已经拼好了love
System.out.println(sb);//println最终也要调用传入参数对象的toString方法,打印Sb
}
public String toString(){
System.out.print("I ");//I
return "java ";
}
}
另外,查看apped();的源码可以发现,最终会调用到传入参数的toString方法。
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
5、重写toString方法的快捷键:快捷键快捷方式alt+shift+s选择toString