关于valueOf方法的思考

关于valueOf方法的思考

问题描述:

  1. 在我早期学习java的时候,朋友提醒,不建议我使用 字符串 + 浮点数 这种打印形式,说是在后续调用某些方法的时候可能会出错,朋友建议我先使用String.valueOf()方法将浮点型转换为字符串类型,再去打印,通过翻阅 java 官网的 api,发现确实可以如此。

  2. 通过学习包装类,我得知可以使用包装类的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() 也是类似的,如下所示:

https://img1.sycdn.imooc.com/climg/65b2848a096398c119261251.jpg

于是,我得出了一个在目前我觉得片面的理解:

  1. 通过 String 类型的 valueOf 方法能够将基本数据类型的值转换成字符串;

  2. 通过包装类的 valueOf 方法,能够将基本数据类型的值转换成包装类对象或者字符串,只不过对于包装类而言:如果需要通过包装类将基本数据类型的值转换成字符串,还需要再调用 toString 方法才行 或者 直接使用包装类的 toString 带参重载方法。

问题描述2:我希望得到一个正确的解答,因为我感觉在钻牛角尖了~~

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好~

1.字符串和浮点数直接使用加号连接,确实可能会有些问题。这是因为加法运算底层使用了StringBulider或者StringBuffer(JDK版本不同,实现也不同),追加操作的时候会因为浮点数的精度问题导致结果不准确。所以也确实建议调用valueOf方法进行转换;

2.String类的valueOf方法和包装类的valueOf方法确实是没有任何关系的,只是重名了而已,和Object也没有关系。以后会见到很多重名的方法,和这里一样,互相可能没有任何关系;

3.String类的toString方法实现只是返回了自身对象,所以如果结果已经是String类型,那么就没有必要再次调用toString方法了;

4.包装类的toString方法已经采用了严谨的方式将自身转化为精度很高的字符串,所以将浮点数包装类转换为字符串时,直接使用toString方法也是可以的。和使用String类的valueOf方法的效果是一样的;

5.打印语句的println和print方法最终调用的也是被打印对象的toString方法,所以实际上,如果不进行加法操作而是直接打印对象,是没有问题的;

祝学习愉快~

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java工程师 2024版
  • 参与学习       2052    人
  • 提交作业       1500    份
  • 解答问题       1324    个

2024重磅革新,超百小时内容豪华升级,加速提升高级技能与高薪就业竞争力 课程紧贴企业最新人才需求,历经7年持续迭代,帮助万名学子入行转行 从零起点到高阶实战,学习路径稳健顺滑,成就从小白到工程师高薪

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师