Java基本数据类型的一些隐性BUG
对于Java的基本数据类型无非就是那四类八种:
1、整数:
定义:没有小数部分的数字,负数是允许的。
种类:Java提供四种整数类型:
byte 1个字节 -128到127
short 2个字节 -32,768到32,767
int 4个字节 -2,147,483,648到2,147,483,647
long 8个字节 -9,223,372,036,854,775,808L到9,223,372,036,854,775,807L
2、浮点数:
定义:含有小数部分的数字。
分类:Java提供两种浮点数:
float 4个字节 约+-3.40282347E+38F(6~7个有效的十进制数位) 绝对值:1.4E-45~3.4E38
double 8个字节 约+-1.79769313486231570E+308(15个有效数位) 绝对值:4.9E-324~1.8E308
说明:
1)float类型的数值有个后缀:f/F,如果没有后缀f/F,那么默认为double。double类型的数值也可以使用后缀d/D。
2)当这些数字遇到取值范围错误时,会发生(上溢Overflow);而在遇到像被零除时,会发生下溢(Underflow)。
3、字符类型:
定义:单引号用来表示char常量,是容纳单字符的一种基本数据类型,占1byte。
说明:
双引号则表示一个字串,他是Java的一个对象,并不是数据类型。
4、布尔类型:
boolean类型只有两个值:false和true。 boolean 类型的数值不能直接转换成其它类型。占1个字节。
对于出布尔类型之外的其他三种类型基本数据之间是可以相互转换,而转换是有两种方式:自动转换和强制转换:
自动转换是指当一个较“小”数据与一个较“大”的数据一起运算时,系统将自动将“小”数据转换成“大”数据,再进行运算。而在方法调用时,实际参数较“小”,而被调用的方法的形式参数数据又较“大”时(若有匹配的,当然会直接调用匹配的方法),系统也将自动将“小”数据转换成“大”数据,再进行方法的调用,自然,对于多个同名的重载方法,会转换成最“接近”的“大”数据并进行调用。
这些类型由“小”到“大”分别为 (byte,short,char)--int--long--float—double。这里我们所说的“大”与“小”,并不是指占用字节的多少,而是指表示值的范围的大小。char在转换为数值是是按照ascii码数值的。
而从“大”数据到“小”数据之间的转换要用强制类型转换,也就是在要转换的数据前加括号,括号中为要转换为的低数据的类型,注意对于byte,short,char三种类型而言,他们是平级的,因此不能相互自动转换,可以使用下述的强制类型转换。
下面就是重点了:
对于整型数据默认给予一个整数Java的虚拟机会认为他是int类型的,如果要表示为long类型就需要在整数后面几l/L;对于一个小数JVM默认认为它是double类型,要表示为float就需要在小数后面加f/F:
正因为这样,如果对于一段这样的代码:
private long msgInvalidDue = 60 * 24 * 3600L * 1000;
这样现在这个表达式,对于右边3600后面加了L表示这是一个long类型的,因此现在计算时它会先把右边的四个整数先转换为long类型在做计算,这样就不会出现溢出的隐性错误。对于double和float也是一样。