java (String)强转 和 toString() 的区别

toString() 和 强制类型转换 (String)

前言:说到toString()和(String), 我相信初学者有很多人在使用toString方法时踩过的坑,本文章介绍toString()和(String)的区别,及如何去避免发生不可预测的错误。
首先,先看一下API文档上Object类的方法简介,如下:

Method Summary

Methods  
Modifier and Type Method and Description
protected Object clone()
Creates and returns a copy of this object.(创建并返回此对象的一个副本
boolean equals(Object obj)
Indicates whether some other object is "equal to" this one.
显示一些其他对象是否“等于”这一个
protected void finalize()
Called by the garbage collector on an object when garbage collection determines 
that there are no more references to the object.
由垃圾收集器对一个对象调用当垃圾收集决定
Class<?> getClass()
Returns the runtime class of this Object.(返回该对象的运行时类
int hashCode()
Returns a hash code value for the object.(返回一个对象的哈希码值
void notify()
Wakes up a single thread that is waiting on this object's monitor.
唤醒一个线程正在等待这个对象的监视器。
void notifyAll()
Wakes up all threads that are waiting on this object's monitor.
(唤醒在这个对象监视器上等待的所有线程。
String toString()
Returns a string representation of the object.
返回一个对象的字符串表示。
void wait()
Causes the current thread to wait until another thread invokes the notify() 
method or the notifyAll() method for this object.
导致当前线程等待另一个线程调用通知()
void wait(long timeout)
Causes the current thread to wait until either another thread invokes the notify() method 
or the notifyAll() method for this object, or a specified amount of time has elapsed.
void wait(long timeout, int nanos)
Causes the current thread to wait until another thread invokes the notify() method or the 
notifyAll() method for this object, or some other thread interrupts the current thread, or a 
certain amount of real time has elapsed

toString()

大概就介绍这么几个Object类中的几个方法,本文我们重要是讲解的是Object中的toString()方法,并且通过源码去分析。
以下是源码:
 public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

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

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

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

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

看一下例子:

public static void main(String[] args) {
        Object a = null;
        Assert.assertTrue(null == a);//true
        Assert.assertTrue(a.toString()==null);//false
    }
所以为了避免这样的错误发生.

String.valueOf()


调用toString()方法的对象不能是null,但接下来这个 String.valueOf()方法略有不同,其实这个方法也是调用了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) 就肯定不行的了,因为valueOf方法是返回的一个字符串,并不是返回的一个对象,如果要比较也得用 "null".equals(object)。

强制转换(String):

情况一、如下图,其实每个对象的类型在对象创建的时候已经确定并且不能更改,所谓强制转换也只是使其表面上满足当前转换的类型,可以使用其方法对这个对象进行处理,但是下图的强制转换编译时都没有通过,更不用说运行时了,在创建时就是Integer类型,不能转换成String类型的


情况二、如下图, 本质上是 Integer 类型,但其表面上确是 Object 类型,所以 编译时已经通过了, 在创建的时候已经确定了其在本质上 Integer 类型,所以这两行代码在运行时依然会报错,因为 Integer 型不能转换成 String 类型

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值