关于valueOf方法的思考
问题描述:
在我早期学习java的时候,朋友提醒,不建议我使用 字符串 + 浮点数 这种打印形式,说是在后续调用某些方法的时候可能会出错,朋友建议我先使用String.valueOf()方法将浮点型转换为字符串类型,再去打印,通过翻阅 java 官网的 api,发现确实可以如此。
通过学习包装类,我得知可以使用包装类的toString方法将基本数据类型转换成字符串
我产生的疑问:在包装类中,valueOf 方法是用于自动装箱:将基本数据类型转换成包装类对象,但是 String 类既不是基本数据类型也不是包装类,且 String 类与包装类又不是继承关系,为什么String 类也有valueOf 方法?难道说 valueOf 方法是一个通用的用于类型转换的重写方法?可是我在 Object 类中也没有找到存在valueOf 方法,这让我陷入了一些矛盾。
相关代码:
public class StringUse {
public static void main(String[] args) {
// 1. 在我早期学习java的时候,朋友建议我先使用String.valueOf()方法将浮点数转换为字符串类型,再去打印
// 防止以后出现一些异常问题
double d1 = 1.321;
String str1 = String.valueOf(d1);
System.out.println(str1 instanceof String);
System.out.println("结果是:" + str1 + 222);
System.out.println("========================");
// 2. 通过学习包装类,我得知可以使用包装类的toString方法将基本数据类型转换成字符串
double d2 = 5.123;
String str2 = Double.toString(d2);
System.out.println(str2 instanceof String);
System.out.println("结果是:" + 111 + str2);
}
}尝试过的解决方式:
通过观察 api 文档发现,String 类存在多个重载的 valueOf 方法,返回的也是字符串对象本身,String 本身也是重写了 toString 方法,输出的是字符串内容,这个是理解的。于是,我对代码做了一些调整:将 String str2 = Double.toString(d2); 换了一种形式:
String str2 = Double.valueOf(d2).toString();
先将 double 类型转换成包装类,再调用包装类的toString()方法将包装类转换成字符串类型赋值给变量 str2(我在此处测试时发现:包装类无法直接转换成 String 类,需要通过toString 方法才能转换成字符串类型),这在结果上与原本的形式是一致的,在形式上与String.valueOf() 也是类似的,如下所示:

于是,我得出了一个在目前我觉得片面的理解:
通过 String 类型的 valueOf 方法能够将基本数据类型的值转换成字符串;
通过包装类的 valueOf 方法,能够将基本数据类型的值转换成包装类对象或者字符串,只不过对于包装类而言:如果需要通过包装类将基本数据类型的值转换成字符串,还需要再调用 toString 方法才行 或者 直接使用包装类的 toString 带参重载方法。
问题描述2:我希望得到一个正确的解答,因为我感觉在钻牛角尖了~~
正在回答
同学你好~
1.字符串和浮点数直接使用加号连接,确实可能会有些问题。这是因为加法运算底层使用了StringBulider或者StringBuffer(JDK版本不同,实现也不同),追加操作的时候会因为浮点数的精度问题导致结果不准确。所以也确实建议调用valueOf方法进行转换;
2.String类的valueOf方法和包装类的valueOf方法确实是没有任何关系的,只是重名了而已,和Object也没有关系。以后会见到很多重名的方法,和这里一样,互相可能没有任何关系;
3.String类的toString方法实现只是返回了自身对象,所以如果结果已经是String类型,那么就没有必要再次调用toString方法了;
4.包装类的toString方法已经采用了严谨的方式将自身转化为精度很高的字符串,所以将浮点数包装类转换为字符串时,直接使用toString方法也是可以的。和使用String类的valueOf方法的效果是一样的;
5.打印语句的println和print方法最终调用的也是被打印对象的toString方法,所以实际上,如果不进行加法操作而是直接打印对象,是没有问题的;
祝学习愉快~
- 参与学习 2052 人
- 提交作业 1500 份
- 解答问题 1324 个
2024重磅革新,超百小时内容豪华升级,加速提升高级技能与高薪就业竞争力 课程紧贴企业最新人才需求,历经7年持续迭代,帮助万名学子入行转行 从零起点到高阶实战,学习路径稳健顺滑,成就从小白到工程师高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星