1.观察Object类的toString源码:
public String toString() {
return getClass().getName() + "@"+Integer.toHexString(hashCode());
}
从源码可以看出,toString打印的是一个类的:类路径+@+hashcode值的十六进制
2.子类重写toString方法
显然,父类Object类中的toString方法不能满足子类Student类的需求,所以我们需要在子类中重写toString方法,一般是输出一个对象的成员信息比较合适,**可以采用自动生成的方法,**idea的快捷键是Alt+ins,选择tostring即可, eclipse的快捷键是alt+shift+s再按S
3.如果打印时不调用对象的toString方法,而是直接打印对象,那会输出什么呢?
即:
Student s =new Student();
System.out.println(s);
输出结果:
如果s是基本数据类型,输出的是内容
如果s是对象,则输出的是s的tostring方法
如果Student类没有重写toString方法,打印出来是这样的:
pratice01.Student1@5a07e868
如果Student类重写了toString方法,那打印出来的就是我们重写的样子:
重写的代码:
@Override
public String toString() {
return "Student1{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
输出结果:
Student1{name='null', age=0}
**理由:**为什么会出现这种情况:
我们可以看下println的源码:
//把对象s传进来
public void println(Object x) {
//调用了valueOf方法
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
//把s传进去
public static String valueOf(Object obj) {
//如果s为null,则打印null,如果s不为空,则打印s的toString方法
return (obj == null) ? "null" : obj.toString();
}
所以,综上,
如果我们想直接打印出一个对象的成员信息,那么该类就必须重写父类Object的toString方法,没有重写的话打印时调用的是父类的toString方法