首先创建类Student,成员变量为name(String)和age(int),另外创建一个Demo类如下:
public class Demo {
public static void main(String[] args) {
Student s = new Student();
s.setName("林青霞");
s.setAge(18);
System.out.println(s);//com.company.Student@1b6d3586
}
}
/*
* author:boyas
*
* */
public class Student {
private String name;
private int age;
public Student(){}
public Student(String name,int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge(){
return age;
}
}
可以看的程序的输出结果为com.company.Student@1b6d3586,是怎么来的呢?
选中println点进去我们可以看到,调用println()把s传给了x
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();//换行
}
}
在这个方法中使用了参数x,我们选中valueof点进去可以看到调用valueof()把x传给了obj,接着我们来判断obj是否等于null,s不为空,所以obj不可能为空,s是new出来的一个Student对象,而Student是继承Object的,所以toString()是被obj调用,
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
我们看到obj调用的toString()返回一个字符串,getClass().getName()返回字节码的全限定类名,也就是 com.company.Student,后面连接一个标记符@,和此对象哈希码的无符号十六进制表示组成。hashCode()调用的是object的hashCode()方法,就是返回用该对象的内部地址转换成的一个整数,toHexString()把这个整数转化成16进制!也就是1b6d3586。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
到这里我们才知道原来它底层调用的是一个toString方法得到这样的信息,而我们Student类并没有toString方法,但是它继承Object类,所以它使用的是Object里的toString方法,但得到的信息不便阅读,因此我们需要重写此方法,在Student类自动生成toString方法即可。如下
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
运行查看结果,这样的结果才是我们能够看懂的。