
2.2 数据类型

扫码看视频
Java的数据类型分为基本数据类型和引用数据类型,如图2-1所示。基本数据类型分为四类(共8种):
● 布尔型——boolean
● 字符型——char
● 整数类型——byte、short、int、long
● 浮点数型——float、double
引用数据类型包括类、接口、数组和枚举。
本节我们介绍Java中的8种基本数据类型和常用的String类型。

图2-1 Java的数据类型
2.2.1 整数类型
Java各整数类型有固定的表数范围和字节长度,而不受具体操作系统的影响,以保证Java程序的可移植性,如表2-1所示。
表2-1 Java的整数类型

1.byte类型
byte类型是一个有符号的8位二进制数(也就是1个字节),它的表数范围是:-128~127。下面声明了一个byte类型的变量:

需要注意的是,byte类型是一个有符号的1个字节的整数,如果你给byteVal赋值-129或者128,这就超过了byte类型的表数范围,编译器会报告错误“不兼容的类型:从int转换到byte可能会有损失”。
2.short类型
short类型是一个有符号的16位二进制数(也就是2个字节),它的表数范围是:-215~215-1。下面声明了一个short类型的变量:

3.int类型
int类型是一个有符号的32位二进制数(也就是4个字节),它的表数范围是:-231~231-1。下面声明了一个int类型的变量:

4.long类型
long类型是一个有符号的64位二进制数(也就是8个字节),它的表数范围是:-263~263-1。下面声明了一个long类型的变量:

2.2.2 浮点类型
Java浮点类型遵循IEEE 754标准,关于该标准,感兴趣的读者可以自行查阅相关资料。不过有一点需要读者注意:浮点数的存储方式与整数是不同的。Java浮点类型有固定的表数范围和字节长度,如表2-2所示。
表2-2 Java的浮点类型

1.float类型
float类型是单精度浮点类型,它占用4个字节的存储空间。

上面的代码声明了一个float类型的变量,并赋值为3.14。读者会发现3.14后面有个字母“f”,这个“f”标识前面的数字是float类型的浮点数。如果我们把f去掉会是什么结果呢?编译器会报告错误:“不兼容的类型:从double转换到float可能会有损失”。
在Java源程序中,当我们直接书写一个小数(如1.5)时,Java编译器默认这个数值是一个double类型的浮点数。因此,我们在为一个float类型的变量赋值时,需要在数字后面添加字母“f”或者“F”。
2.double类型
double类型是双精度浮点类型,它占用8个字节的空间,精度比float类型要高。

上面的代码声明了一个double类型的变量,并赋值为3.14。在给double类型的变量赋值时,书写的小数就不需要添加任何后缀了。
2.2.3 字符(char)型
char类型数据用来表示通常意义上的“字符”。在Java中,char类型比较特殊,它本质上是一个无符号的16位二进制数(2个字节)。Java为了让char类型能够存储多种语言的字符,采用了Unicode来对字符进行编码,而Unicode是采用双字节无符号数对字符进行编码的字符集,所以在Java中,char类型占用2个字节。

上面的代码声明了一个char类型的变量chVal,并赋予了一个字符“a”。当我们给一个char类型的变量赋值时,一定要注意使用单引号将字符括起来,你也可以赋值一个大于0小于65535的值(Unicode编码)。

若我们无意间使用了双引号,在编译时编译器就会报告错误:“不兼容的类型:String无法转换为char”。从这个错误提示中我们可以知道,用双引号括起来的字符 "a" 是一个字符串类型(String),而chVal变量是char类型,所以出现了类型不匹配的错误。
2.2.4 布尔(boolean)型
boolean类型适用于逻辑运算,一般用于程序流程控制。它只有两个值:true和false,不可以用0或非0的整数来替代false和true。熟悉C++的读者一看到boolean,就会想到C++中的bool类型,不过Java的boolean类型要特殊一些,它只接收true和false,在C++中,我们可能习惯于声明一个bool类型的变量,并给它赋0或1这种数值,但是这种方式在Java中是不允许的。

我们可以把boolean类型的变量想象成开关,它无非就是开或者关两个状态。在声明boolean类型的变量时,熟悉C++的读者可能会把boolean关键字写成bool,这种笔误需要读者小心。
2.2.5 String类型
String类型并不属于上面介绍的8种基本类型,不过String类型在Java中是一个很常用的类型,表示字符串类型。确切地说,String是一个类,它封装了一些关于字符串的操作。

上面两行代码声明了一个String类型的变量,并给变量赋值为“Hello World!”。注意,在声明字符串变量时,要注意“String”的大小写,不要把“String”写成“string”了,而且在给字符串赋值时要使用双引号包裹住字符串。
给字符串变量赋值还有一些其它的方法:
