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}

































[原]toString()方法的复写作用, 以及打印集合.的更多相关文章

  1. 复写equals、hashCode和toString方法

    equals.hashCode和toString 这三个方法都是object类的方法,由于所有的类都是继承这个类,所以每一个类都有这三个方法. 1.复写equals方法 原则: 首先,两个实例是相同的 ...

  2. 为何重写toString方法后会使哈希码能够打印出来

    首先还是推荐lz看源代码 简单的讲之所以调用了toString()方法,不是什么编译器默认的,而是因为lz你调用的是out.print()方法仔细看源代码,在PringStream类中,print方法 ...

  3. JAVA中toString方法的作用

    因为它是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法”. 它通常只是为了方便输出,比如System.out.println(xx),括号里面的“xx”如果不 ...

  4. JAVA中toString方法的作用(转)

    因为它是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法”. 它通常只是为了方便输出,比如System.out.println(xx),括号里面的“xx”如果不 ...

  5. 打印对象和toString方法

    JAVA对象 java对象是都是Object类的实例,都可直接调用该类中定义的方法,这些方法提供了处理java对象的通用方法. > > 6.2.1打印对象和toString方法    先看 ...

  6. 当使用System,out.println()打印一个对象是自动调用toString方法

    在Java中,所有的对象都是继承自Object,自然继承了toString方法,在当使用System,out.println()里面为一个对象的引用时,自动调用toString方法讲对象打印出来.如果 ...

  7. 优雅的重载toString方法,打印对象内容而不是打印内存地址的方法

    如果直接在日志或者System.out.println中打印java对象,会打印这个对象的内存地址,而不是具体内容. 为了便于调试,一般的做法有2种: 1.重写toStrong方法 2.将对象传入JS ...

  8. java类中根据已有的变量复写类的toString方法

    java类中根据已有的变量复写类的toString方法: 在该类中定义好变量之后,shift+alt+s,从出现的列表中点击gemerate toString,就会自动生成对应的toString方法.

  9. 自己(转)JAVA中toString方法的作用

    JAVA中toString方法的作用 因为它是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法”. 它通常只是为了方便输出,比如System.out.print ...

随机推荐

  1. MYSQL:基础——3N范式的表结构设计

    基于3N范式的数据表设计 范式 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小. 关系数据库现有六种范 ...

  2. php添加或升级扩展模块步骤

    php添加或升级扩展模块步骤: 1).下载对应扩展的稳定版源码包2).进入到解压后的源码包执行: sudo /usr/local/php/bin/phpize //对应安装到哪个php版本 sudo ...

  3. linux下tomcat的配置及项目的部署流程

    Java的安装配置 1. 在/etc/profile文件中配置相应的信息(如下) export JAVA_HOME=/usr/java/jdk1.6.0_20 export JRE_HOME=/usr ...

  4. Linux删除文件后空间不释放

    最近线上 elasticsearch 由于磁盘空间不足报错,于是乎对磁盘进行了分析,删除了一些 Tomcat 日志文件,但是删除后发现并没有磁盘空间释放.于是 google 了一下. 原来在Linux ...

  5. Entity Framework在Asp.net MVC中的实现One Context Per Request(转)

    上篇中"Entity Framework中的Identity map和Unit of Work模式", 由于EF中的Identity map和Unit of Work模式,EF体现 ...

  6. linux学习-文件打包与压缩

  7. C++ typedef的一个用法

    1.不适用typedef: #include <iostream> #include <cstring> using namespace std; struct Books { ...

  8. 一段神奇的代码,解决form表单背景偏黄问题

    一段神奇的代码,解决form表框背景偏黄问题 最近在做项目时,发现自己做的挺好看的表单,背景变成了黄色,所以这次折腾了好久终于找到了符合我的决绝办法,现在来分享给大家 一般解决这种input表框偏黄问 ...

  9. Failed to install xxxx.apk on device 'emulator-5554!

    异常信息:[HelloAndroid] Performing com.example.helloandroid.HelloAndroid activity launch[HelloAndroid] U ...

  10. OpenCV——径向模糊

    参考来源: 学习OpenCV:滤镜系列(5)--径向模糊:缩放&旋转 // define head function #ifndef PS_ALGORITHM_H_INCLUDED #defi ...