Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15524
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 115
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-25 10:41
文章分类

全部博文(9)

文章存档

2014年(1)

2013年(8)

我的朋友

分类: Java

2013-12-30 12:39:10

toString()方法很常用,我们从下面几个方面讨论

1. 为什么要重写toString()方法
toString()方法顾名思义,调用该方法后得到一个String字符串
toString()方法被设计成Object类中的方法,换句话说每个类都有这个方法,在Object类中它的定义如下
  1. public String toString() {
  2.     return getClass().getName() + "@" + Integer.toHexString(hashCode());
  3. }
通过代码看到,这样的设计返 - 回类的名字 + @ + 散列码(hashcode)的无符号十六进制表示
我们看一段代码
  1. Object o = new Object();
  2. System.out.println(o);


    //结果
    java.lang.Object@a20232
很明显这样的toString()方法得到的结果很多时候不是我们想看到和所关心的,比方说对于电话号码这个实例,我们希望在toString()后看到实际有用的信息,例(408)86/-5309,而不是PhoneNumber@163b91,明显前者更加信息丰富
toString()方法的重写在面对集合对象时尤为重要

因此,建议所有类都重写toString()方法,是为了满足"
洁,信息丰富,易于阅读的表达形式"

2. toString()的自动调用
当一个对象被传递给println, 字符串连接操作(+), assert的时候,toString()方法会被自动调用

3. toString()方法的返回值格式
在实现toString()的时候,你需要决定是否指定返回值的格式,指定格式的好处在于它的标准性,无二义性,适合人阅读,但是如果你指定了格式,一个好的做法是同时提供一个相匹配的String构造函数,这样开发人员可以很容易的在对象和它的字符串表达式之间转换
例如
一个Student类,有姓名(name)和性别(gender)两个成员变量,当实现了toString()方法返回“姓名-性别”的形式,如:“张三-男”,那么最好同时对Student类提供一个接受String形参的构造函数,当接受了"张三-男"作为参数的时候,能构成name=张三,gender=男这样一个student实例
值得庆幸的是,包括BingInteger,BigDecimal和绝大多数的原语类型包装类(Wrapper Class)都采用了上面这样的做法

反过来讲,指定toString()方法的返回格式也有不足之处,那就是不便于将来格式需要变动时候的需求,而
不指定格式可以保留灵活性,方便改进总之各有利弊

不管你选择指定格式还是不指定格式,都要在文档中明确表明你的意图(即:把注释写清楚,做人要厚道)
阅读(368) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~