简述

  在Java中,往往需要把一个类型的变量转换成String 类型。作为菜鸟,有时候我会使用(String) data,有时候就使用data.toString(),如果不行还会试试 String.valueOf(data),但始终不是很清楚它们有什么不同。前几天在coding,由于是用gwt-ext编写界面的时候出现了转型错误,所以也没有提示java.lang.ClassCastException的异常,只是提示gwt exception thrown and not caught。找了半天才发现原来是因为这个,现特记录一下,以后碰到了也就更清楚些。

  看完简述,如果你已完全了解就可以走了,如果也是不太懂可以看看,如果有不对的地方还可以讨论。这也算是开头加上个简述的作用,就是已经了解的人不必重复花时间看了。

toString()方法

先看API 中关于 toString()的描述:

返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。

Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())

toString()方法返回的是这个对象的字符串表示,就像是这个对象的名字一样,任何对象都可以有自己的名字,你可以重写其toString()方法,给其赋予任意的名字。

但是调用toString()方法的对象不能为 null,否则会抛出异常:java.lang.NullPointerException。

String.valueOf()方法

上边提到,调用toString()方法的对象不能是null,但接下来这个 String.valueOf()方法却不管这些,其实这个方法也是调用了toString()方法,只不过在调用之前做了点处理,我们来看一下源码:

    /**
* Returns the string representation of the <code>Object</code> argument.
*
* @param obj an <code>Object</code>.
* @return if the argument is <code>null</code>, then a string equal to
* <code>"null"</code>; otherwise, the value of
* <code>obj.toString()</code> is returned.
* @see java.lang.Object#toString()
*/
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}

不看注释,直接看代码也知道,这个方法就是在调用 toString() 之前判断一下这个对象是不是null,如果不是null,则正常调用其toString()方法,如果是null 的话,则返回字符串形式的null。

String.valueOf() 比起直接用 toString() 来说虽然可能会减少报错的机会,但是如果在对比对象值的时候可要小心,要注意如果用if(String.valueOf(object)==null) 就肯定不行的了。

强制转换 (String)data

这个是初学者最容易出错的,其实每个对象的类型在对象创建的时候已经确定并且不能更改,所谓强制转换也只是使其表面上换成了另一种类型,可以使用其方法对这个对象进行处理。那么可想而知,把物品A 当成物品B 来使用,当A 能能够被当成 B的时候大家都相安无事,你走你的路,我过我的桥,一旦A 不能被当成B ,它不会去自动调用 toString()方法,而是马上就会报错。

例一:

Integer obj1 = new Integer(100);
String strVal = (String)obj1;  //Cannot cast from Integer to String

因为obj1 在创建的时候就是 Integer 类型,不能转换成 String 类型,所以在编译期间就会报错Cannot cast from Integer to String。

例二:

Object obj2 = new Integer(100);
String strVal = (String)obj2;

obj2 虽然本质上是 Integer 类型,但其表面上确是 Object 类型,所以在编译的时候没有报错,但因为 obj2 在创建的时候已经确定了其在本质上 Integer 类型,所以这两行代码在运行时依然会报错,因为 Integer 型不能转换成 String 类型。

当然,如果要把 Integer 型转换成 String,可以调用其 toString()方法:Integer.toString(obj1) 或者 String.valueOf(obj1); 对应于其他自定义类型,则调用自己重写的 toString() 方法。

此外,因null值可以被强制转换为任何类型,所以(String)null也是合法的。

参考资料

toString() 和 (String) 以及 valueOf() 三者的对照关系[java]的更多相关文章

  1. (String)、toString、String.valueOf的区别

    String.valueOf()它可以将JAVA基本类型(int,double,boolean等)和对象(Object)转换成String型toString()是对象的方法,它可以将该对象转换成Str ...

  2. 转换String三种方式比较:toString()、String.valueOf()、(String)

    简单介绍: 1.toString,需要保证调用这个方法的类.方法.变量不为null,否则会报空指针. 2.String.valueOf.这个方法在使用的时候是有些特殊的.一般情况下,如果是确定类型的n ...

  3. (String)强制转换、toString()和String.valueOf()的区别

    String:毫无疑问,这种就是强转形式,简单方便,效率高.java程序员可能看到效率高或许有些激动,但是它有他的不好,那就是局限性.在java的世界里没有什么东西是没有缺点的,总有一些好的方面同时也 ...

  4. Java中String.valueOf、toString、(String)的区别

    原文地址http://blog.csdn.net/yangzhaomuma/article/details/51173138 原文地址https://www.cnblogs.com/xhyouyou/ ...

  5. String、toString、String.valueOf()三个有啥区别?

    今天在使用这个的时候发现,他们三者好像在某些场所都是可以用的,但是不免会让人想到那既然它们三者这么的相似,那么总有些什么区别吧.我也在网上找了一些资料看.自己也看了API文档,就将他们三的区别总结一下 ...

  6. 【转载】(String)、toString、String.valueOf的区别

    用于个人参考,查看请前往原地址http://blog.csdn.net/springk/article/details/6414017 问题讨论http://bbs.csdn.net/topics/2 ...

  7. toString()和String.valueof()比较

     toString()和String.valueof()比较 做项目时常常会用到类型转换,比较常用的是toString(),但其实还是用String.valueof()比较好.看源码后他们的区别就更加 ...

  8. (String)、toString()与String.valueOf()的区别

    (String).Object.toString()正常情况下跟String.valueOf()没有区别. 但当Object是null的时候.toString会抛出异常.valueOf返回" ...

  9. Java中String字符串toString()、String.valueOf()、String强转、+ ""的区别

    Object#toString(): Object object = getObject(); System.out.println(object.toString()); 在这种使用方法中,因为ja ...

随机推荐

  1. 十个书写Node.js REST API的最佳实践(下)

    收录待用,修改转载已取得腾讯云授权 5. 对你的Node.js REST API进行黑盒测试 测试你的REST API最好的方法之一就是把它们当成黑盒对待. 黑盒测试是一种测试方法,通过这种方法无需知 ...

  2. [Android Pro] 调用系统相机和图库,裁剪图片

    private static final int PHOTO_REQUEST_TAKEPHOTO = 1;// 拍照 private static final int PHOTO_REQUEST_GA ...

  3. 利用SmtpClient发送邮件

    1  163邮箱 HOST:smtp.163.com public static string CreateTimeoutTestMessage(string server) { string Suc ...

  4. atitit.微信支付的教程文档 attilax总结

    atitit.微信支付的教程文档 attilax总结 1. 支付流程概览 1 2. 设置支付起始文件夹   host/app/paydir/ 1 3. 设置oauth验证域名 1 4. 測试文件夹 能 ...

  5. Java学习笔记1、常用dos命令

    cd 改变当前目录 sys      制作DOS系统盘 copy 拷贝文件 del 删除文件 deltree 删除目录树 dir 列文件名 diskcopy 制磁盘 edit 文本编辑 format ...

  6. Java中abstract class 和 interface 的解释和他们的异同点(转)

    (一)概述    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存 在,才赋予了Java强大的 面向对象能力.abstract ...

  7. HttpClient4.3教程 第二章 连接管理

    2.1.持久连接 两个主机建立连接的过程是很复杂的一个过程,涉及到多个数据包的交换,并且也很耗时间.Http连接需要的三次握手开销很大,这一开销对于比较小的http消息来说更大.但是如果我们直接使用已 ...

  8. JConsole的使用手册 JDK1.5(转)

    一篇Sun项目主页上介绍JConsole使用的文章,前段时间性能测试的时候大概翻译了一下以便学习,今天整理一下发上来,有些地方也不知道怎么翻,就保留了原文,可能还好理解点,呵呵,水平有限,翻的不好,大 ...

  9. Android实现截图分享qq,微信

    代码地址如下:http://www.demodashi.com/demo/13292.html 前言 现在很多应用都有截图分享的功能,今天就来讲讲截图分享吧 今天涉及到以下内容: android权限设 ...

  10. php处理行业分类数据

    实现步骤: 1.将excel表格存储为后缀名为 .csv格式的文件: 2.将.csv格式文件导入到mysql数据库中: 3.通过条件查询将所需要的数据查出并导入另一个数据表中: 下面是一些php片段: ...