在Java语言中,数据类型分为基本类型和对象类型。其中对象类型继承Object类,按照存储对象的内存模型进行数据存储。对象引用存储在内存栈上,而对象本身的值存储在内存堆上。这个概念上没有什么值得需要注意的地方。这里,我想说的主要还是java的基本数据类型。
一般来说也就是比较公认的java包括8中基本类型(有的人也说void是一种类型),从类型上又可分为:布尔型、字符型和数值型;其中数值型又可分为整数和实数2种。
|
|
| |||||||
|
|
|
|
|
|
|
| ||
| boolean | – | – | – | Boolean | false | |||
| char | 16-bit | ‘\u0000’ | ‘\uFFFF’ | Character | ‘\u0000’ | |||
| 整数 | byte | 8bits | -128 | +127 | Byte | |||
short | 16bits | -215 | +215-1 | Short | |||||
int | 32bits | -231 | +231-1 | Integer | |||||
long | 64bits | -263 | +263-1 | Long | 0L/0l | ||||
实数 | float | 32bits | IEEE754 | IEEE754 | Float | 0.0F/0.0f | |||
double | 64bits | IEEE754 | IEEE754 | Double | 0.0D/0.0f | ||||
|
|
需要说明的是boolean类型所占存储空间的大小没有明确指定,仅定义为能够取字面值true或false,它占用的空间取决于Java虚拟机(JVM)的实现,可能是1位也可能是1个字节。
而类型可以自动转化,但需要满足的规则是byte -> short(char) -> int -> long -> float -> double逐步提升。向下就得加强制转换符号。但有可能失去信息。默认的整数都是int,默认的小数都是double。要定义float以及long等类型时得加个后缀,F(小写也可以)或者L。否则编译不会通过。这也就是编译期间检查编译器会在编译期对byte、short、int、long、float、double、char型变量的值进行检查,如果超出了它们的取值范围就会报错。
byte bb = 1455;//编译过不了 eclipse会提示: Type mismatch: cannot convert from int to byte |
并且当使用+、-、*、/、%运算符对基本类型进行运算时,遵循如下规则:
- 只要两个操作数中有一个是double类型的,另一个将会被转换成double类型,并且结果也是double类型;
- 否则,只要两个操作数中有一个是float类型的,另一个将会被转换成float类型,并且结果也是float类型;
- 否则,只要两个操作数中有一个是long类型的,另一个将会被转换成long类型,并且结果也是long类型;
- 否则,两个操作数(包括byte、short、int、char)都将会被转换成int类型,并且结果也是int类型。
当使用+=、-=、*=、/=、%=、运算符对基本类型进行运算时,遵循如下规则:运算符右边的数值将首先被强制转换成与运算符左边数值相同的类型,然后再执行运算,且运算结果与运算符左边数值类型相同。这也是经常在某些面试题上出现的问题。
还需要说明的是从JDK5.0开始,Java基本数据类型及其对应包装类之间能实现自动装箱解箱操作。就是说int自动装箱成Integer等。