Java中一共有8种基本类型,其中有4中整型、2种浮点类型、1种字符类型char(用于表示Unicode编码的代码单元)和一种用于表示真值的boolean类型。
整型
整型用于表示没有小数部分的数值,允许是负数。Java提供了4种整型,如下:
名称 | 存储空间 | 取值范围 |
---|---|---|
byte | 1字节 | -128(-2的7次方)~127(2的7次方-1) |
short | 2字节 | -32768 (-2的15此方)~32767 (2的15次方-1) |
int | 4字节 | -2147483648 (-2的31次方)~ 2147483647 (2的31次方-1) |
long | 8字节 | -9223372036854775808 (-2的63次方)~9223372036854775807 (2的63次方-1) |
需要注意的是,由于Java程序必须保证在所有机器上都能够得到相同的运行结果,所以各种数据类型的取值范围必须固定,也就是说所有数值类型所占据的字节数与平台无关。另外,java没有任何无符号形式的int、long、short或byte类型。
浮点类型
浮点类型用于表示有小数部分的数值。在Java中有两种浮点类型:
名称 | 存储空间 | 取值范围 |
---|---|---|
float | 4字节 | 大约正负3.40282347E+38F(有效位数为6~7位) (2的128次方-1) |
double | 8字节 | 大约正负1.79769313486231570E+308(有效位数为15位) (2的1024次方-1) |
double表示这种类型的数值精度是float类型的两倍(有人称之为双精度数值)。实际上,只有很少的情况适合使用float类型,例如,需要单精度的库,或者需要存储大量数据时。
float类型的数值有一个后缀F或f。没有后缀F的浮点数值总是默认为double类型。
需要注意的是,浮点数值不适用于无法接受舍入误差的金融计算。例如,命令System.out.println
(2.0-1.1)将打印0.8999999999999999,而不是我们期望的0.9。这种舍入误差的主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确地表示分数1/10。这就好像十进制无法精确地表示分数1/3一样。如果在数值计算中不允许有任何舍入误差,就应该使用BigDecimal类。
Char类型
char类型原本用于表示单个字符。不过,现在情况已经有所变化。如今,有些Unicode字符可以用一个char值描述,另外一些Unicode字符这需要两个char值。
char类型的字面量值要用单引号括起来。在Java中,char类型描述了UTF-16编码中的一个代码单元。但是在实际应用中,强烈建议不要在程序中使用char类型,除非确实需要处理UTF-16代码单元。最好将字符串作为抽象数据类型处理。至于为什么不建议使用,这涉及到Unicode编码的演变以及后续的改进,这里不再详述。
boolean类型
boolean类型有两个值:true和false,用来判断逻辑条件。整型值和布尔值之间不能进行相互转换。
数值类型之间的转换
6个实线箭头,表示无信息丢失的转换;另外有3个虚线箭头,表示可能有精度损失的转换。
当用一个二元运算符链接两个值时(例如n+f,n表示整数,f是浮点数),先要将两个操作数转换为同一种类型,然后再进行计算,转换规则如下。
- 如果两个操作数中有一个是double类型,另一个操作数就会转换为double类型。
- 否则,如果其中一个操作数是float类醒,另一个操作数将会转换为float类型。
- 否则,如果其中一个操作数是long类型,另一个操作数将会转换为long类型。
- 否则,两个操作数都将被转换为int类型。
从以上内容可知,在必要的时候,int类型的值将会自动转换为double类型。但是另一方面,有时也需要将double转换成int。在Java中,允许进行这种数值之间的类型转换,当然,有可能会丢失一些信息。这种可能丢失信息的转换要通过强制类型转换来完成。强制类型转换的语法格式是在圆括号中给出想要转换的目标类型,后面紧跟待转换的变量名。