[原]toString()方法的复写作用, 以及打印集合.

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}

来自为知笔记(Wiz)

时间: 2024-11-05 23:42:53

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

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

在Java中,所有的对象都是继承自Object,自然继承了toString方法,在当使用System,out.println()里面为一个对象的引用时,自动调用toString方法讲对象打印出来.如果重写了tostring方法则调用重写的toString 方法. 因为System.out.println()的这个方法源码中调用了String.valueOf(Objec o),public void println(Object x) {        String s = String.valu

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

首先还是推荐lz看源代码 简单的讲之所以调用了toString()方法,不是什么编译器默认的,而是因为lz你调用的是out.print()方法仔细看源代码,在PringStream类中,print方法是这样写的 public void print(Object obj) { write(String.valueOf(obj)); }此时调用了String的静态方法valueof这个方法是这样的 public static String valueOf(Object obj) { return (

整个对象也可以打印?-重写toString方法

对象也可以打印? 看到对象是可以打印的,打印了全类名+内存地址 若想自定义打印类的详细信息就要在Person类中重写toString方法 @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("姓名:"+name+"\n"); sb.append("年级:"+gender+"\n"); sb.append(&

JAVA中toString方法的作用

因为它是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法”. 它通常只是为了方便输出,比如System.out.println(xx),括号里面的“xx”如果不是String类型的话,就自动调用xx的toString()方法 总而言之,它只是sun公司开发java的时候为了方便所有类的字符串操作而特意加入的一个方法 回答补充: 写这个方法的用途就是为了方便操作,所以在文件操作里面可用可不用 例子1: public class Orc { public st

打印对象和toString方法

JAVA对象 java对象是都是Object类的实例,都可直接调用该类中定义的方法,这些方法提供了处理java对象的通用方法. > > 6.2.1打印对象和toString方法    先看下面程序:  程序清单:codes/06/6-2/PrintObjectjava public class PrintObject{ public static void main(String args[]){ Person p = new Person("帅气de猪八戒"); Syst

一个对象toString()方法如果没有被重写,那么默认调用它的父类Object的toString()方法,而Object的toString()方法是打印该对象的hashCode,一般hashCode就是此对象的内存地址

昨天因为要从JFrame控件获取密码,注意到一个问题,那就是用toString方法得到的不一定是你想要的,如下: jPasswordField是JFrame中的密码输入框,如果用下面的方法是得不到密码的value的: jPasswordField.getPassword().toString(); 这是因为jPasswordField.getPassword()得到的是字符数组char[],然后调用toString方法得到的是这个字符数组的hashCode,即字符数组的内存地址. 只有用下面的方

原!! java直接打印一个对象时,并不是直接调用该类的toString方法 ,而是会先判断是否为null,非null才会调用toString方法

网上看了好多java直接打印一个对象时,直接调用该类的toString方法 . 但是: Object obj=null; System.out.println(obj);//没有报错 System.out.println(obj.toString());//报空指针异常 System.out.println(obj);既然也是直接调用toString方法,为什么不报错??? 原因总结如下: 1.调用Object类的toString方法,必须保证object不是null值,否则将抛出NullPoi

Object类及toString方法介绍

一.Object类介绍 Object类在JAVA里面是一个比较特殊的类,JAVA只支持单继承,子类只能从一个父类来继承,如果父类又是从另外一个父类继承过来,那他也只能有一个父类,父类再有父类,那也只能有一个,JAVA为了组织这个类组织得比较方便,它提供了一个最根上的类,相当于所有的类都是从这个类继承,这个类就叫Object.所以Object类是所有JAVA类的根基类,是所有JAVA类的老祖宗.所有的类,不管是谁,都是从它继承下来的. 二.toString方法介绍 一个字符串和另外一种类型连接的时

java重写toString()方法

toString()方法是Object类的方法,调用toString()会返回对象的描述信息. 1)为什么重写toString()方法呢? 如果不重写,直接调用Object类的toString()方法,打印的是该对象的内存地址(类名@哈希码值).如下代码所示: class Person { String name; String sex; int age; public Person() {} public Person(String name, String sex, int age) { t