转自https://www.cnblogs.com/yuxiaoqi/p/3562161.html

简述

  在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)的更多相关文章

  1. toString()和强制类型转换(String)的用法

    原来是String类型的才可以强转到String,不然会报 ClassCastException异常: 所有的引用类型都从Object类继承了toString方法.

  2. JS基础_强制类型转换-String

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. Java中如何使用非强制类型转换把字符串转换成int类型

    ①强制类型转换代码如下: String string = "123456"; int a,b = 0; @Test public void String2Int1() { //方法 ...

  4. 强制类型转换之String类型

    ㈠布尔(Boolean)类型 布尔值只有两个,主要用来做逻辑判断 true   表示真 :   false   表示假 使用typeof检查一个布尔值时,会返回boolean   ㈡Null和Unde ...

  5. C#整数三种强制类型转换int、Convert.ToInt32()、int.Parse()、string到object 的区别

    1.int适合简单数据类型之间的转换,C#的默认整型是int32(不支持bool型); 2.int.Parse(string sParameter)是个构造函数,参数类型只支持string类型; 3. ...

  6. java强制类型转换

    在Java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结.常用的方法有Object.toString(),(String)要转换的对象,St ...

  7. 转:JAVA强制类型转换

    object对象转换为String的一些总结 ----------------------------------------------------------------------------- ...

  8. 尽量采用as操作符而不是旧式C风格做强制类型转换

    http://www.cnblogs.com/JiangSoney/archive/2009/08/07/1541488.html MSDN: https://msdn.microsoft.com/z ...

  9. C#中的强制类型转换与as转换的区别

    C#中的强制类型转换 例如有ClassA与ClassB两个类创建两个类的对象进行转换 1 2 ClassA a = new ClassA();  ClassB b = new ClassB(); 如果 ...

随机推荐

  1. Android 开发中 SQLite 数据库的使用

    SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, ...

  2. 【JVM】查看JVM加载的类及类加载器的方法

    查看JVM加载了哪些类 java -verbose[:class|gc|jni] 在输出设备上显示虚拟机运行信息. java -verbose:class 在程序运行的时候有多少类被加载!你可以用ve ...

  3. 【BZOJ2242】计算器(BSGS,快速幂)

    [BZOJ2242]计算器(BSGS,快速幂) 题面 BZOJ 洛谷 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最小非负整数x: 3.给 ...

  4. 「SCOI2015」小凸玩密室 解题报告

    「SCOI2015」小凸玩密室 虽然有心里在想一些奇奇怪怪的事情的原因,不过还是写太久了.. 不过这个题本身也挺厉害的 注意第一个被点亮的是任意选的,我最开始压根没注意到 \(dp_{i,j}\)代表 ...

  5. 构建SSH服务

    什么是SSH?简单说,SSH是一种网络协议,用于计算机之间的加密登录.如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露.最 ...

  6. [SCOI2014]方伯伯的OJ(线段树)

    方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题.Oj上注册了n个用户,编号为1-n“,一开始他们按照编号排名. 方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和编号: 1.操作格式为 ...

  7. CF1142C U2(计算几何,凸包)

    题目大意:平面上有 $n$ 个点,第 $i$ 个点是 $(x_i,y_i)$.问有多少条抛物线(二次项系数为 $1$),经过这些点中不同的两个点,并且内部(不含边界)没有任何这些点.重合的抛物线只算一 ...

  8. 用foobar进行码率转换 适用与sacd-r转成低码率

    之前下载了不少高清音频,有黑胶转录的也有母带文件.这些高清音频大都是24bit,采样率96khz或者88.2khz或者更高.而我想将部分精品专辑刻录成cd.首先我需要将这些文件转换为16bit,44. ...

  9. CF341E Candies Game

    题目链接 题意 有\(n\)个盒子,第\(i\)个盒子里面有\(a_i\)个糖果.每次选择两个盒子\(i,j\),假设\(a_i \le a_j\).然后从第\(j\)个盒子中拿出\(a_i\)个糖果 ...

  10. WPF开发的界面调用C++生成的dll文件

    以引用d1.dll为例. [生成d1.dll] 文件——新建——项目——Visual C++——Win32项目,选择DLL,点击Finish.在d1.cpp中添加代码 #include "s ...