一、Java四大数据类型分类
1、整型(byte 、short、int 、long)
byte 的取值范围:-128~127(-2的7次方到2的7次方-1)
short 的取值范围:-32768~32767(-2的15次方到2的15次方-1)
int 的取值范围:-2147483648~2147483647(-2的31次方到2的31次方-1)
long 的取值范围:-9223372036854774808~9223372036854774807(-2的63次方到2的63次方-1)
注意:
虽然byte、short、int、long 数据类型都是表示整数的,但是它们的取值范围可不一样。
byte、short 的取值范围比较小,
long的取值范围时最大的,所以占用的空间也是最多的。
int 取值范围基本上可以满足我们的日常计算需求了,
所以 int 也是我们使用的最多的一个整型类型。
2、浮点型(float 、double)
float(单精度浮点型)取值范围:3.402823e+38~1.401298e-45
double(双精度浮点型)取值范围:1.797693e+308~4.9000000e-324
其中(e+38 表示乘以10的38次方,而e-45 表示乘以10的负45次方)
注意:
float 和 double 都是表示浮点型的数据类型,它们之间的区别在于精确度的不同。
double 类型比float 类型存储范围更大,精度更高。
通常的浮点型数据在不声明的情况下都是double型的,
如果要表示一个数据时float型的,可以在数据后面加上 "F" 。
浮点型的数据是不能完全精确的,有时候在计算时可能出现小数点最后几位出现浮动,这时正常的。
3、字符型(char)
char 有以下的初始化方式:
char ch = 'a';--可以是汉字,因为是Unicode编码
char ch = 1010; -- 可以是十进制数、八进制数、十六进制数等等。
char ch = '\0'; --可以用字符编码来初始化。
注意:
Java是用unicode 来表示字符,“中” 这个中文字符的unicode 就是两个字节。
String.getBytes(encoding)方法获取的是指定编码的byte数组表示。
通常gbk / gb2312是两个字节,utf-8 是3个字节。
如果不指定encoding 则获取系统默认encoding 。
4、布尔型(boolean)
boolean它只有两种取值:true 、false。
二、八种基本数据类型

三、基本类型之间的转换
在Java中,boolean 类型与其他7中类型的数据都不能进行转换,这一点很明确。
但对于其他7种数据类型,它们之间都可以进行转换,只是可能会存在精度损失或其他一些变化。
注意:
将6种数据类型按下面顺序排列一下:
double > float> long > int > short > byte
如果从小转换到大,那么可以自动类型转换,
如果从大转换到小,或char和其他6种数据类型转换,则必须使用强制转换。
1、自动类型转换
自动转换时发生扩宽。因为较大的类型(如int)要保存较小的类型(如byte),内存总是足够的,不需要强制转换。如果将字面值保存到byte、short、char、long的时候,也会自动进行类型转换。在自动类型转化中,除了以下几种情况可能会导致精度损失以外,其他的转换都不能出现精度损失。除了可能的精度损失外,自动转换不会出现任何运行时异常。
int--> float
long--> float
long--> double
float -->double
注意:
从int(没有带L的整型字面值为int)到byte/short/char也是自动完成的,虽然它们都比int小。
2、强制类型转换
如果要把大的转成小的,或者在short与char之间进行转换,就必须强制转换,,因为必须显式地使数值更小以适应目标类型。强制转换采用转换操作符()。严格地说,将byte转为char不属于强制类型转换,因为从byte到char的过程其实是byte-->int-->char。强制转换可能导致精度损失。强制转换格式如下:
整数型强制转换规则:
如果整数的值超出了byte所能表示的范围,结果将对byte类型的范围取余数。例如a=256超出了byte的[-128,127]的范围,所以将257除以byte的范围(256)取余数得到b=1;需要注意的是,当a=200时,此时除了256取余数应该为-56,而不是200。
浮点型强制转换规则:
将浮点类型赋给整数类型的时候,会发生截尾(truncation)。也就是把小数的部分去掉,只留下整数部分。此时如果整数超出目标类型范围,一样将对目标类型的范围取余数。
7种基本类型转换总结如下图:

3、赋值及表达式中的类型转换:
(1)字面值赋值
在使用字面值对整数赋值的过程中,可以将int赋值给byte short char int,只要不超出范围。这个过程中的类型转换时自动完成的,但是如果你试图将long 赋给byte,即使没有超出范围,也必须进行强制类型转换。
(2)表达式中的自动类型提升
除了赋值以外,表达式计算过程中也可能发生一些类型转换。在表达式中,类型提升规则如下:
a.所有byte/short/char都被提升为int。
b.如果有一个操作数为long,整个表达式提升为long。float和double情况也一样。
四、基本数据类型的包装类:
Java是面向对象语言,其概念为一切皆为对象,但基本数据类型算是个例外哦,基本数据类型大多是面向机器底层的类型,它是 “值” 而不是一个对象,它存放于“栈”中而不是存放于“堆”中,但Java一切皆为对象的概念不是说说而已,它为每一个基本数据类型都做了相应的包装类,包装类就是一个对象,它存放于“堆”中。我们日常使用中大多情况下都会使用着这些包装类:

1、整型(byte 、short、int 、long)
byte 的取值范围:-128~127(-2的7次方到2的7次方-1)
short 的取值范围:-32768~32767(-2的15次方到2的15次方-1)
int 的取值范围:-2147483648~2147483647(-2的31次方到2的31次方-1)
long 的取值范围:-9223372036854774808~9223372036854774807(-2的63次方到2的63次方-1)
注意:
虽然byte、short、int、long 数据类型都是表示整数的,但是它们的取值范围可不一样。
byte、short 的取值范围比较小,
long的取值范围时最大的,所以占用的空间也是最多的。
int 取值范围基本上可以满足我们的日常计算需求了,
所以 int 也是我们使用的最多的一个整型类型。
2、浮点型(float 、double)
float(单精度浮点型)取值范围:3.402823e+38~1.401298e-45
double(双精度浮点型)取值范围:1.797693e+308~4.9000000e-324
其中(e+38 表示乘以10的38次方,而e-45 表示乘以10的负45次方)
注意:
float 和 double 都是表示浮点型的数据类型,它们之间的区别在于精确度的不同。
double 类型比float 类型存储范围更大,精度更高。
通常的浮点型数据在不声明的情况下都是double型的,
如果要表示一个数据时float型的,可以在数据后面加上 "F" 。
浮点型的数据是不能完全精确的,有时候在计算时可能出现小数点最后几位出现浮动,这时正常的。
3、字符型(char)
char 有以下的初始化方式:
char ch = 'a';--可以是汉字,因为是Unicode编码
char ch = 1010; -- 可以是十进制数、八进制数、十六进制数等等。
char ch = '\0'; --可以用字符编码来初始化。
注意:
Java是用unicode 来表示字符,“中” 这个中文字符的unicode 就是两个字节。
String.getBytes(encoding)方法获取的是指定编码的byte数组表示。
通常gbk / gb2312是两个字节,utf-8 是3个字节。
如果不指定encoding 则获取系统默认encoding 。
4、布尔型(boolean)
boolean它只有两种取值:true 、false。
二、八种基本数据类型

三、基本类型之间的转换
在Java中,boolean 类型与其他7中类型的数据都不能进行转换,这一点很明确。
但对于其他7种数据类型,它们之间都可以进行转换,只是可能会存在精度损失或其他一些变化。
注意:
将6种数据类型按下面顺序排列一下:
double > float> long > int > short > byte
如果从小转换到大,那么可以自动类型转换,
如果从大转换到小,或char和其他6种数据类型转换,则必须使用强制转换。
1、自动类型转换
自动转换时发生扩宽。因为较大的类型(如int)要保存较小的类型(如byte),内存总是足够的,不需要强制转换。如果将字面值保存到byte、short、char、long的时候,也会自动进行类型转换。在自动类型转化中,除了以下几种情况可能会导致精度损失以外,其他的转换都不能出现精度损失。除了可能的精度损失外,自动转换不会出现任何运行时异常。
int--> float
long--> float
long--> double
float -->double
注意:
从int(没有带L的整型字面值为int)到byte/short/char也是自动完成的,虽然它们都比int小。
2、强制类型转换
如果要把大的转成小的,或者在short与char之间进行转换,就必须强制转换,,因为必须显式地使数值更小以适应目标类型。强制转换采用转换操作符()。严格地说,将byte转为char不属于强制类型转换,因为从byte到char的过程其实是byte-->int-->char。强制转换可能导致精度损失。强制转换格式如下:
整数型强制转换规则:
如果整数的值超出了byte所能表示的范围,结果将对byte类型的范围取余数。例如a=256超出了byte的[-128,127]的范围,所以将257除以byte的范围(256)取余数得到b=1;需要注意的是,当a=200时,此时除了256取余数应该为-56,而不是200。
浮点型强制转换规则:
将浮点类型赋给整数类型的时候,会发生截尾(truncation)。也就是把小数的部分去掉,只留下整数部分。此时如果整数超出目标类型范围,一样将对目标类型的范围取余数。
7种基本类型转换总结如下图:

3、赋值及表达式中的类型转换:
(1)字面值赋值
在使用字面值对整数赋值的过程中,可以将int赋值给byte short char int,只要不超出范围。这个过程中的类型转换时自动完成的,但是如果你试图将long 赋给byte,即使没有超出范围,也必须进行强制类型转换。
(2)表达式中的自动类型提升
除了赋值以外,表达式计算过程中也可能发生一些类型转换。在表达式中,类型提升规则如下:
a.所有byte/short/char都被提升为int。
b.如果有一个操作数为long,整个表达式提升为long。float和double情况也一样。
四、基本数据类型的包装类:
Java是面向对象语言,其概念为一切皆为对象,但基本数据类型算是个例外哦,基本数据类型大多是面向机器底层的类型,它是 “值” 而不是一个对象,它存放于“栈”中而不是存放于“堆”中,但Java一切皆为对象的概念不是说说而已,它为每一个基本数据类型都做了相应的包装类,包装类就是一个对象,它存放于“堆”中。我们日常使用中大多情况下都会使用着这些包装类:
