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. python3里面的图片处理库 pillow

    在python2下用pil,而在python3下可以安装pillow 功能,在图片上加上几个字 #coding: utf-8 myPath = "./" fontPath = &q ...

  2. Redis持久化——AOF(二)

    核心知识点: 1.AOF:以独立日志的方式记录写命令,重启时再执行命令.与RDB不同的是解决数据持久化的实时性,可以记录所有写操作. 2.AOF工作流程:写入命令.文件同步.文件重写.文件加载. 3. ...

  3. MYSQL:基础——事务处理

    MYSQL:基础——事务处理 事物处理 1.什么是事物处理 事务处理(transaction processing)可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行 ...

  4. BOM之history

    history是JavaScript中BOM上的一个对象,其中存储了浏览器的历史记录 history存储简单过程 浏览器会将一个窗口中访问的网页进行记录,不管我们通过以下哪种方式改变页面,浏览器都会把 ...

  5. STM32 JTDO JREST复用为普通IO

    一.开启AFIO的时钟(必须保证先打开AFIO,否则无效) RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 二.禁用JTAG,使能SWD GP ...

  6. hd acm2035

    求A^B的最后三位数表示的整数.说明:A^B的含义是“A的B次方” 思路:后三位只跟后三位相乘有关,所以可以每乘一次都对1000取余. 代码: #include <stdio.h>#inc ...

  7. 算法(Algorithms)第4版 练习 1.3.31

    双向链表实现: //1.3.31 package com.qiusongde.linkedlist; public class DoublyLinkedList<Item> { priva ...

  8. ubuntu commands mysql

    use table; //选择某个表 show tables; //展现有几个表 select * from table; //显示表内容

  9. css sprite技巧详解

    1. [代码][CSS]代码 CSSSprites在国内很多人叫css精灵,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问该页面时,载入的图片 ...

  10. PHP限制IP访问 只允许指定IP访问 允许*号通配符过滤IP

    /** * 检测访问的ip是否为规定的允许的ip * Enter description here ... */ function check_ip(){ $ALLOWED_IP=array('192 ...