黑马程序员技术交流社区

标题: 【武汉校区】分享:Java数据类型和数据类型转换 [打印本页]

作者: 武汉分校-小舞    时间: 2016-3-22 16:00
标题: 【武汉校区】分享:Java数据类型和数据类型转换
本帖最后由 武汉分校-小舞 于 2016-3-22 16:02 编辑

Java数据类型和数据类型转换

数据类型概述
Java是一种强类型的语言,对每一种数据都规定了明确的数据类型,不同的数据类型在内存中所占用的内存空间不一样。

数据类型分类
在Java中把数据类型分为基本数据类型和引用数据类型,它们在内存中的位置不一样,基本数据类型在栈内存当中,引用数据类型在堆内存当中。基本数据类型又分为整数型,小数型(浮点型),字符型和布尔型;引用数据类型包括类(class),接口(interface)和数组([])。请看下图


基本数据类型中,每一种数据类型在内存中所占用的空间也不一样,所表示的数据范围也不一样,请看下图
注:E表示10的几次幂,用“^”表示2的几次幂
  
分类
  
数据类型
所占空间
数据范围
整数类型
byte
1个字节
-128~127
short
2个字节
-2^15~2^15-1
int
4个字节
-2^31~2^31-1
long
8个字节
-2^63~2^63-1
小数型
float
4个字节
-3.403E38~3.403E38
double
8个字节
-1.798E308~1.798E308

数据范围分析
一个byte类型的数据占用1个字节,1个字节是8位,二用最高位表示符号位(0表示整数,1表示负数),其他位表示数值为,所以有了下面的数据范围
符号位          数值位          十进制
正数       0                   1111111            127
负数       1                   1111111            -127
有一个特殊的值,如果数值位全都是0,那么就有+0和一个-0,为了避免重复,将10000000(可以理解为1即表示数值位,也表示符号位)规定为-128
正数       0                   0000000            0
负数       1                   0000000            -128
short,int,long以此类推,可以得到上图所示的数据范围

数据类型转换
同一个数据类型可能在多个数据范围内,如127即在byte范围内,也在short,int,和long的范围内,既然表示的是同一个数据,那么他们之间就可以相互转换,但是转换可以分为下面两种情况

默认类型转换
有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,然后再进行计算
注意:当byte,short和char在参与运算的时候,系统会默认的将数据类型转换为int数据类型再参与运算
由此可以总结出默认转换时一种从小到大的转换,数据的大小发生改变
我们可以把byte,short,int,long看成不同容量的杯子,而杯子里面的水就是数据,byte杯子里面的水可以倒入short,int,long杯子里面,水的量不会改变;反之则不一定
例如:   
int a=3;
byte b=4;
bytebb=a+b;//  这里赋值不正确
上面的代码中,因为a是int类型,b是byte类型,a和b做加法运算,b会默认的提升为int类型,再参与运算,得到的结果也是int类型,那么再把结果用byte接收,就会有错

强制类型转换
上面的例子,我们知道a与b的和为7,而7明明是在byte的范围内,我们就想让赋值给byte类型,怎么做呢?


可以用到强制类型转换,格式如下:
目标数据类型 变量名 =(目标数据类型)被转换数据
按照这个格式,把上面的例子转换一下
Int a=3;
Byte b=4;
Byte bb=(byte)(a+b);

强制转换详解
Int a=3的二进制表现形式,4个字节
0000-0000 0000-00000000-0000 0000- 0011
Byte b=4的二进制表现形式 1个字节
0000-0100
a+b在做运算的时候b会默认的转换为int类型,如下
二进制                                                                  十进制
0000-00000000-0000 0000-0000 0000-0011          3
+    0000-0000 0000-0000 0000-0000 0000-0100            4

0000-00000000-0000 0000-0000 0000-0111            7
得到的结果是7,是一个int类型(4个字节),
我们知道7是在byte的范围内,需要把int类型强制转换为byte(1个字节),就是把int的前三个字节给截掉,只保留最后的一个字节(8位),如下
0000-00000000-0000 0000-0000 0000-0111
那么得到的结果就是1个byte类型数据0000-0111

强制类型转换注意事项
强制类型转换容易造成精度损失,在上面的例子中7是在byte范围内了,可以用强制转换数据的大小没有发生改变,但是如果被转换的数据超过了byte范围,强制转换就数据的大小就会发生改变
如:int a=263
0000-00000000-0000 0000-0001 0000-0111
byte b=(byte)a;将a强制转换为byte
0000-00000000-0000 0000-0001 0000-0111
那么得到的结果就是1个byte类型数据0000-0111 结果为7

归纳:
(1)容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度降低或溢出;使用时要格外注意。
(2)有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,然后再进行计算。

想获取最新传智播客武汉中心分享技术文章请加QQ  1641907557 ,后期会分享更多与实体班同步教程,助你冲击月薪20K!



推荐阅读:

《【武汉分校】UI实体班同步教程+海量素材,打造年薪20W全能设计师》
《黑马程序员Android实体班同步项目Demo源码汇总,挑战月薪20K!




作者: sl943508135    时间: 2016-3-22 20:15
学习了 总结的不错   
作者: 604840337    时间: 2016-3-22 20:49
不错,感谢总结
作者: mundane    时间: 2016-3-22 21:14
头像是本人吗?我已经看醉了
作者: 武汉分校-小舞    时间: 2016-3-23 09:15
sl943508135 发表于 2016-3-22 20:15
学习了 总结的不错


作者: 武汉分校-小舞    时间: 2016-3-23 09:15
mundane 发表于 2016-3-22 21:14
头像是本人吗?我已经看醉了


作者: wangzai628    时间: 2016-3-24 22:48
不错,赞一个




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2