1、由于java中的类都直接或间接的继承了Object类,而在Object类中有一个toString的函数用于输出函数信息。
2、println的方法中有一个重载的参数类型是Object类。(为什么能接收子类的实例?这与多态有关)
3、基于上述条件,当我们把实例做为参数时,println中对应的方法启动,并最终调用了toString()放法,这个方法用于返回该类的一些信息(String型)。
4、基于前三点,我们可以将Object的toString方法在子类中重写,用于输出我们希望看到的信息。其中一个典型例子就是ArrayList类的实例输出。
实验:
注:选中函数ctrl + B可转至对应的代码段,可以进入底层
package ClassNameToPrint;
/*
研究把类名作为print的参数
*/
public class PrintClassName {
public static void main(String[] args) {
TestClass tc = new TestClass();
tc.setName("张三");
tc.setAge(18);
System.out.println(tc);
/*
Step1:
public void println(Object x) {
String s = String.valueOf(x);
if (getClass() == PrintStream.class) {
// need to apply String.valueOf again since first invocation
// might return null
writeln(String.valueOf(s));
} else {
synchronized (this) {
print(s);
newLine();
}
}
Step2:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
Step3:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
*/
}
}
package ClassNameToPrint;
public class TestClass {
private String name;
private int 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;
}
}
输出:ClassNameToPrint.TestClass@3b07d329
在子类中重写toString方法:
@Override
public String toString() {
return "TestClass{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
快捷键CTRL + Alt + insert, 选中需要的参数。(当然也可以补充自己需要的信息)
输出:TestClass{name='张三', age=18}