龙空技术网

自学Java6(保姆级教学)——基本数据类型的转换

叫我章瑾呐 160

前言:

现时我们对“java数据类型转换规则”大致比较注重,我们都需要分析一些“java数据类型转换规则”的相关资讯。那么小编也在网上搜集了一些关于“java数据类型转换规则””的相关资讯,希望你们能喜欢,兄弟们快快来学习一下吧!

在上一期的文章中,我们认识了Java的几种运算符,先来简单回顾一下Java共有几类运算符:

1.算数运算符:+,-,*,/(加减乘除),加上一个%(取余)

2.赋值运算符:=

3.关系运算符:>,<,==,!=

4.逻辑运算符:&,|,^和!

5.短路运算符:&&和||

6.三目运算符(也有叫三元运算符):a>b ? a : b

篇幅所限,这里不再多做赘述,感兴趣的小伙伴可以去看看我前面的几篇文章,相对写得还是比较详细的。

那么,本期文章我们来说一下,我们为什么会用到数据类型的转换?这个例子其实在我们的生活中是经常发生的,比如:你买东西,一件T恤50元,一件裤子40.5元,那么我一共要付多少钱呢?对于我们人来说,这就是个很简单的加法运算,恐怕一年级的学生也不会做错,但是对于计算机而言,这就不是我们看上去的那么简单的一个过程了。

如果是我们用Java去计算的话,我们会将T恤的价格定义为整数型的变量,会将裤子的价格定义为浮点型的变量,那么问题就来了,我们需要定义一个什么类型的变量去接受这两个变量的和呢?或者说,这两个变量,在不做其他操作的情况下,是否可以相加呢?那么我们可以去Java代码中去实验一下,分别用int和double类型的变量去接受一下结果,看看是什么情况:

首先是用int类型去接收:

其实我们的开发工具已经很智能在给我们报错了(其实有点基础的都知道这是IDEA,但是为了照顾基础差的同学,我们暂时不去管这是什么软件,我们只需要去看它出现的现象就可以了),那么我们运行一下,看看具体的输出结果:

可能有很多初学的小伙伴看不懂是什么意思,但是你只要看得懂中国字,应该也就大概知道出了什么问题:“不兼容的类型: 从double转换到int可能会有损失”,说明当int类型的数据与double类型的数据去相加的时候,我们需要去用double去接受,到底是不是这样呢?我们眼见为实:

这里开发工具就没有给我们报错,运行看看结果是否正确:

正确的输出了90.5的答案,那么为什么会出现这样的情况呢?

首先我们假设int可以接收它们两者的和,但是90.5,很明显是个小数,而我们的int只能存储或者说定义整数,那么我们如果用int去接收这个数的话,最多也就只能只能接收整数的部分,即90,那么后面的0.5就会损失掉,这就是前面报错提到的精度损失。但是很奇怪的是,为什么用double就可以接收了呢?那是因为浮点型的取值范围是要大于整数型的,而整数型的数据,比如说上文中的50,可以写成50.0,并不会有任何的精度损失,那么由较小的取值范围转换为较大的取值范围的这么一个过程,我们就叫它作自动类型转换

那么说到这里,可能有的小伙伴就要不服了,那我们就要用int去接收呢?难道就没办法了吗?很明显,办法是有的,但是肯定是要损失精度的,我们可以使用强制类型转换:

如图所示:这样的话程序就不会报错,但是我们看一下运行结果:

结果就变成了90,很明显,和实际的90.5还是有一定的偏差的。由此可以看出,强制类型其实是由范围较大的数据转换为范围较小的数据的这么一个过程,但是这个过程肯定是会损失精度的。

这里,我按照取值范围由小到大的顺序,给大家拍一下整数型和浮点型:

byte<short<int<long<float<double

从左至右则是自动类型转换,从右至左则需要进行强制类型转换。

其实这个稍微拓展一点,我个人觉得有点类似于java三大特性中的多态。如果是没有基础的小伙伴,这一段可以不用看,因为这一段是属于我自己的一个扩展的想法,有基础的同学可以跟着这个思路去拓展一下:

我们都知道Java的多态是父类引用指向子类对象,其实这个说白了,也是一种由大到小的这么一个转换,就好比说,我们可以说子类一定是父类,但是我们不能说父类一定是子类。举个例子:如果我们将总的生物类作为父类的话,那么人,植物和动物都可以做它的子类,我们可以说人是生物,也可以说植物是生物,但是我们不能反过来说,生物是人,或者生物是植物这样的话,那样很明显不符合逻辑,很明显父类的范围是要大于子类的范围的,所以我觉得强制转换其实和多态是存在一定的可对比性的,我们可以将知识进行串联和比较,这样会更有利于我们对知识的理解。

最后更文不易,希望大家可以多多点赞评论分享,当然如果可以留下一个关注自然是更好的啦~您的支持就是我更文最大的动力!

标签: #java数据类型转换规则