java中的每个类的根都是Object的子类. 必然有拥有了Object的所有方法.
在package java.lang.Object源码中:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode()); // 类的全限定名[email protected]+哈希地址
}
eg:
Object o = new Object();System.out.println(o); //结果[email protected]
自定义类, 不去实现toString方法, 打印结果会是什么样呢?
public static class Person { // 自定义Person类, 未重写 toString()函数 Integer id = 1; String name = "duenboa"; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
由于是静态内部类, 在外部类中调用main方法测试结果入下:
Person p = new Person();System.out.println(p); //[email protected]c1
接下来, 去重写toString()函数
public static class Person { Integer id = 1; String name = "duenboa"; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person{" + "id=" + id + ", name=‘" + name + ‘\‘‘ + ‘}‘; }
测试结果入下:
Person p = new Person();System.out.println(p); //Person{id=1, name=‘duenboa‘}
在了解上述现象之后, 大家应该都明白. 当子类重写父类函数之后, 调用是以子类优先的.那么,在集合对象的打印场景中.
System.out.println(map);
这句最基本的标准打印控制函数的实现又是如何调用的呢?
在java.io.PrintStream.java类源码中, 依旧还是通过String.valueOf(Obj)去获取String.
public void println(Object x) { String s = String.valueOf(x); //1 synchronized (this) { print(s); newLine(); }}
在java.lang.String.java源码中,valueOf(Obj)的实现如下:
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString();}
在这里, String的valueOf与直接使用对象的toString()方法还是有很大的差异的,在实际开发中也可以利用这个小技巧去优雅的避免空指针问题.[建议开发中涉及到打印对象或者拼接对象字符串的时候, 使用String.valueOf(目标对象) ] 因为, 在这里首先会判断入参obj是否为空, 为空则直接返回null, 否则再去调用对象的toString()函数. 如果一开始就调用对象的toString()函数, 必然会出现NullPointerException.
在使用集合时, 常常需要去打印日志,查看内容,如果集合存储的基本类型的包装类, 那么自然是可以打印出内容的.
但是存放的是基本类型包装类之外的对象时, 示例如下:
List list = new ArrayList();list.add(new Person());list.add(new Person());System.out.println(list); // Person类有重写toString方法时[Person{id=1, name=‘李克用‘}, Person{id=1, name=‘李克用‘}]System.out.println(list); // Person类未重写toString方法时[[email protected]d4, [email protected]61] Map<Integer, Person> map = Maps.newHashMap();map.put(1,new Person());map.put(2,new Person());System.out.println(map);//{1=Person{id=1, name=‘李克用‘}, 2=Person{id=1, name=‘李克用‘}}System.out.println(map);//{[email protected]c191, [email protected]5076}
时间: 2024-11-05 23:42:53