前言:如果一个厨师对不了解食材,那么他就不可能做好一道菜。对程序员来说,程序就像一道菜,数据就像食材,操作符等相关的语法就像就是对菜的加工。以下是Java的数据类型的整体框架。而在所有的Java数据类型中,基础数据类型又是基础中的基础,这也是本文的主要讨论对象。
目录
数值型
int
long
short
byte
浮点型
double
float
字符型char
布尔类型boolean
字面常量
类型转换
怎么记忆?
数值型
数值型可以简单的理解为整数。
int
之所以先介绍int类型,是因为int类型的可以说是程序设计中最为常用的类型了,且其具备代表性,因此放在第一个介绍。
定义方式: int 变量名 = 整数或变量;
大小:四个字节(任何环境下)。实际上任何Java的基本数据类型在任何环境下的大小都一致,是因为JVM的存在。这也是Java程序的可移植性强的重要原因之一。以下介绍的其他基础数据类型都在任何环境下一致,因此下面就不再赘述。
对应包装类:Interger
取值范围:最大值为Integer.MAX_VALUE 最小值与Integer.MIN_VALUE
注意点:int的最大值+ 1的结果是最小值,而int的最小值 - 1是最大值,这涉及原码、反码和补码的知识。
long
当int类型的取值范围不能满足具体的需求时,就轮到Long上场了。
定义方式: long 变量名 = 整数L或变量;或 long 变量名 = 整数l;
一般推荐第一种定义方式,这是因为小写l容易和数字1混淆。
大小:八个字节。
对应包装类:Long
取值范围:long的最值取得方式类比int类型,且其最大值 + 1 和最小值 - 1的结果同样可以参考int类型。(实际上整数基本数据类型的的最值和运算特性都类似,以下的short和byte类型的不再赘述。)
short
定义方式: short 变量名 = 整数或变量;(不能超过short的取值范围)
大小:两个字节。
对应包装类:Short
byte
实际上byte是Java中较为特殊的基础数据类型,有自己独特的使用场合,这里仅讨论基础知识。
定义方式: byte 变量名 = 整数;(不能超过short的取值范围)
大小:一个字节。
对应包装类:Byte
浮点型
浮点即带有小数点的数值,可以表示小数。
特性:由于浮点型的内存里的存储特点,无法计算出完全精确的数值。
double
最常用的浮点型。
定义方式: double 变量名 = 数值或变量名;
大小:8个字节。
对应包装类:Double
float
定义方式: float 变量名 = 数值F或变量名; 或 float 变量名 = 数值f或变量名;
大小:四个字节
对应包装类:Float
字符型char
大小:两个字节。
这是值得注意的地方,不同与C语言的1个字节。实际上这是由于Java采用了不同的编码方式 nicode
取值范围特点:没有负数。
Java里是没有无符号数的,但char类型的特例。
对应包装类:Character
布尔类型boolean
大小:一般认为无明确定义,存在争议。也有的书上写1个字节,有的书上写1个bit位。
取值范围:true和false两个取值(只有这两个可能)
对应包装类:Boolean
注意点:boolean和其他的基本数据类型无法转换(包括int),这与很多常见的语言不同,这是也是基本数据类型里最容易让人混淆的地方。
字面常量
在基本数据类型的初始化过程中,最常用的就是用数值直接赋值了,这些数值有一个更规范的术语——字面常量。但这也是,这也是很容易混淆的地方。字面常量可以用十进制表示、十六进制表示和指数表示等等,还可以加后缀字符(之前你已经见到在字面常量后面加L或F的操作了,这些就是字面常量的后缀字符),本博文主要讨论字面常量的类型确定方式。
实际上,编译器没办法直接确定所有的字面常量的类型。有时可以直接确定,有时有需要添加字面常量加后缀字符以“帮助”编译器确定字面常量的类型。
那编译器什么时候可以直接确定字面常量的类型呢?即当字面常量没有超过你要赋值的变量的取值范围时。所以在日常编写代码时,最好不要超过要赋值的变量的取值范围,否则编译器会判定这个字面常量是另一个更大的类型,而无法成功的赋值。
例如:
byte b = 44;
这是成功赋值的案例。
//byte b = 128;//error
编译器报错:无法把int赋值给byte。
这里的逻辑是:由于128超过了byte的取值范围,编译器把128认为是一个int变量,而int类型无法存放进比int小的变量中(除非用了使用强转操作符)。(顺带一提,当没有更合适的类型时,编译器会把整数字面常量认为是int类型,而浮点字面常量认为是double。)
类型转换
这是很值得说道的一个点。基本数据类型的转换与基本数据类型息息相关,涉及了操作符的知识,本篇为了不引起混淆,本博客只提到了int和boolean类型的转换问题,而其他的类型转换没有再提。实际上类型转换包括了扩展转换(小转大)和窄化转换(大转小),这部分的内容将在操作符章节的类型转换中具体讲解。
怎么记忆?
可以参考这样的记忆顺序:基本先按照字节大小的顺序,再把浮点和布尔单独分出来记忆。
一个字节:byte
两个字节:short、char
四个字节:int
八个字节:long
浮点:四个字节:float、八个字节:double
布尔:boolean
连起来就是:byte、short、char、int、long、float、double、boolean。刚好8个。



