java中的每个类的根都是Object的子类. 必然有拥有了Object的所有方法.

在package java.lang.Object源码中:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode()); // 类的全限定名+@+哈希地址
}
eg:
Object o = new Object();
System.out.println(o); //结果java.lang.Object@bab5e85

自定义类, 不去实现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); //com.hoss.weixin.controller.eflow.EfHrChgController$Person@2e7aacc1


接下来, 去重写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方法时[com.hoss.weixin.controller.eflow.EfHrChgController$Person@53ffb7d4, com.hoss.weixin.controller.eflow.EfHrChgController$Person@397dea61]

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);//{1=com.hoss.weixin.controller.eflow.EfHrChgController$Person@70d4c191, 2=com.hoss.weixin.controller.eflow.EfHrChgController$Person@1ff05076}

































最新文章

  1. Linux下Steam中支持中文的办法
  2. Spring文件上传配置
  3. Windows phone8.1教务在线客户端
  4. WCF初探-9:WCF服务承载 (下)
  5. thinkphp 内置标签volist 控制换行
  6. win7 64位 mongodb2.6.0 安装服务启动
  7. dzzoffice的树型结构用户管理设计
  8. hdu 3807
  9. SelectSingleNode和SelectNodes区别
  10. Java虚拟机学习 - 体系结构 内存模型
  11. 阿里云主机SSD实例磁盘测试及IO调度算法调整
  12. CevaEclipse - 常用设置
  13. 201521123035《Java程序设计》第一周学习总结
  14. KaliLinux常用服务配置教程DHCP服务工作流程
  15. JDBC连接ORACLE的三种URL格式
  16. Windows 10 IoT Core 17127 for Insider 版本更新
  17. Go GraphQL初学者教程
  18. strpos检测字符串是否包含元素
  19. Ubuntu更改源和搜狗输入法安装卸载
  20. linux系统lnmp环境包搬家教程

热门文章

  1. full_case parallel_case学习心得
  2. 在Nginx中做负载均衡配置的实例讲解
  3. Java EE规范是如何制定的
  4. python 3 mysql sql逻辑查询语句执行顺序
  5. web框架详解之tornado 二 cookie
  6. python正则-- re模块
  7. 关于mysql使用索引的一个问题
  8. maven pom filter 导致的问题记录
  9. JavaScriptr -- 常用对象 String, date, prototype
  10. Django-01