基本数据类型
数据类型的出现是为了把数据分成所需内存不同的数据。Java中的数据类型大致可以分类两类,一类是基本数据类型,别一类就是对象类型。
下表列出了基本数据类型,以及他们的存储长度与表示的范围:
数据类型 | 存储空间(字节) | 表示范围 |
---|---|---|
byte | 1 | -128至127 |
short | 2 | -32768至32767 |
int | 4 | -(2^31)至(2^31 - 1) |
long | 8 | -(2^61)至(2^61 - 1) |
float | 4 | 大约-3.40282347E38至3.40282347E38 |
double | 8 | 大约-1.79769313486231570E308至1.79769313486231570E308 |
char | 2 | 所有的unicode字符 |
boolean | 1 | true或者false |
各类基本数据类型值可能具有格式
上面是将整个基本数据类型的定义列出,根据基本数据类型所表示的数据可以划分为以下类别:
- 整数:byte、short、int、long
- 浮点数(小数):float、double
- 字符:char
- 布尔:boolean
整型可能具有的值形式
二进制表示形式,以0b开始。例如0b00001010, 表示十进制的10
八进制表示形式,以0开始。例如012,表示十进制的10
十进制表示形式,以该类型表示范围内的任意整数,例如10就表示10(常用)
十六进制表示形式 ,以0x开始。例如0xA表示十进制的10
注:不论值是以什么形式进行表示,都不能够超过该数据类型所能够表示范围。
JDK1.7后又增加了一项,可在数位之间使用下划线()作为分割,不可以使用下划线结束至的定义,例如:234_。其主要是用于提高可读性。例如:我们有一个很大的数字100000000,这个时候这个数据的可读性很差,那么我们将其表示为100_000_000三位一组分开,这样就很容易识别出这个数字是1亿。当然它可以用于以上四种形式中的任意一种。
浮点型可能具有的值形式
所有的整型值的定义方式都实用于浮点类型,但是int、long自动类型转换为浮点类型,有可能丢失精度。因为浮点类型的表示范围比整型大,将会自动类型转换。但是表示浮点类型表示的精度却没有Int、long型的精度大。
在定义float类型值时,在值后面更上大写或者小写的F。例如:float f = 1f;如果确定定义的是一个浮点类型的值,那么这个F是必须的,请看下面两条:
如果你定义的一个整形的值赋值给float,这时是没有任何错误的,但是这个这个将会让编译器认为这里是一个自动类型转换。
如果你定义的值是一个浮点数。例如float f = 10;那么编译的时候编译器将会告诉你“将double类型转换为float类型将会丢失精度”。
在定义double类型值时,在值后面更上大写或者小写的D。例如 double d = 1d; 也可以不跟D,例如double d = 1.0;但是个人建议跟上D,否则当你无意识的定义一个整型赋值给float类型的时候,编译器会认为这是一个自动类型转换。
科学计数法定义浮点值,例如:float f = 1.234567E6f,相当于float f = 1234567.0F;
字符型可能具有的值形式
所有的unicode代码点所对应的字符常量。例如 : 65、97分别对应了字符’A’、’a’。
所有的unicode代码点所对应的字符。例如 :‘a’、’1’、’&’等等。
所有的unicode编码单元,即\u0000至\uFFFF。例如:\u0008表示非打印字符退格,即“\b“。
注:可以了解一下字符编码的历史过程。便于能够更深入的了解为什么这里的字符表示的是unicode字符,而不是asscll字符、iso8859-1等。
布尔型可能具有的值形式
表示“真”的值true
表示“假”的值false
基本数据类型之间的转换
研究类型转换之前,首先搞清楚数据类型的表示范围。关系如下:
关系1:byte -> short -> int -> long -> float -> double
关系2:char -> int -> long -> float -> double
自动类型转换
以下情况将会出现自动类型转换:
自动类型转换是指将表示范围小的数据类型赋值给表示范围大的数据类型,下面是一个简单的例子:
byte b = 10; //这是一个表示范围最小的整数类型
int i = b; //这是一个比byte表示范围大的整数类型,这里的b的值10将自动类型转换为int类型或者是表示范围小的数据类型与大数据类型混合参与计算,下面以一个例子说明:
int i = 10;
float f = 1f;
int result = i + f; //这句代码将会编译不通过
float reault = i + f; //变量i与变量f类型不相同,混合计算得出的结果将是他们之中表示范围更大的那个类型,并且在计算之前会先将i自动转为float类型再进行计算。
强制类型转换
以下情况将会出现强制类型转换:
- 将一个表示范围大的数据类型赋值给表示范围小的数据类型。下面是一个列子:
int i = 10;
byte b = i;//这里将会发生强制类型转换,因为byte类型表示的范围比int类型的小。
注:强制类型转换可能会丢失精度,除非你知道你自己在做什么。