数据类型
java虚拟机操作的数据类型可以分为两类:原始类型(primitive type也叫原生类型或基本类型)和引用类型(reference type),与之对应的也存在原始值和引用值。
原始类型和值
Java虚拟机所支持的原始数据类型包括数值类型、boolean类型和returnAddress类型。
- 数值类型
- 整数类型(默认值为0)
- byte类型:值为8位有符号二进制补码整数
- short类型:16位
- int类型:32位
- long类型:64位
- char类型:值为使用16位无符号整数表示的、指向基本多文种平面(Basic MultilingualPlane,BMP)的Unicode码点,以UTF-16编码,默认值为Unicode的null码点(’\u0000’)
- 浮点类型
- float类型:值为单精度浮点数集合中的元素,或者是单精度扩展指数集合中的元素,默认为正数0
- double类型:值为双精度浮点数集合中的元素,或者是双精度扩展指数集合中的元素,默认为正数0
- boolean类型:值为true和false,默认为false
- returnAddress类型:该类型是指向某个操作码(opcode)的指针,此操作码与虚拟机指令相对应。
在虚拟机支持的所有原始类型中只有returnAddress类型不能与Java语言的数据类型相对应。
浮点类型、取值集合及浮点值
所有Java虚拟机实现必须支持两种标准的浮点值集合:单精度浮点数集合和双精度浮点数集合。可以自由选择是否支持单精度扩展指数集合和双精度扩展指数集合。
任意一个非零的、可数的任意浮点值都可以表示为
s
×
m
×
2
e
−
N
+
1
s\times m\times {2}^{e-N+1}
s×m×2e−N+1的形式,其中
s
s
s可以是+1或者-1,
m
m
m是一个小于
2
N
2^N
2N的正整数,
e
e
e是一个介于
E
m
i
n
=
−
(
2
K
−
1
−
2
)
E_{min}=-(2^{K-1}-2)
Emin=−(2K−1−2)和
E
m
a
x
=
(
2
K
−
1
−
1
)
E_{max}=(2^{K-1}-1)
Emax=(2K−1−1)之间的整数(包括
E
m
i
n
E_{min}
Emin和
E
m
a
x
E_{max}
Emax),这里N和K的取值取决于当前采用的浮点数值集合。
参数 | 单精度浮点数集合 | 单精度扩展指数集合 | 双精度浮点数集合 | 双精度扩展指数集合 |
---|---|---|---|---|
N N N | 24 24 24 | 24 24 24 | 53 53 53 | 53 53 53 |
K K K | 8 8 8 | ≥ 11 \geq11 ≥11 | 11 11 11 | ≥ 15 \geq15 ≥15 |
E m a x E_{max} Emax | + 127 +127 +127 | ≥ + 1023 \geq+1023 ≥+1023 | ≥ + 1023 \geq+1023 ≥+1023 | ≥ + 16383 \geq+16383 ≥+16383 |
E m i n E_{min} Emin | − 126 -126 −126 | ≤ − 1022 \leq-1022 ≤−1022 | − 1022 -1022 −1022 | ≤ − 16382 \leq-16382 ≤−16382 |
returnAddress类型和值
returnAddress类型的值会指向一条虚拟机指令的操作码。该类型和数值类的原生类型不同,java中并不存在与之对应的类型,而且也不能在程序运行时修改。
boolean类型
虽然jvm中定义了该类型,不过并没有提供专用的字节码指令,在java中使用的boolean值都会在编译后,使用jvm的int数据类型来代替,在oracle公司的jvm实现里,java中的boolean数组会被编译成byte数组,jvm会ture映射为1,而false映射成0。
引用类型和值
jvm中有3中引用类型:类类型(class type)、数组类型(array type)以及接口类型(interface type),这些引用类型的值分别指向动态创建的类实例、数组实例和实现了某个接口的类实例或数组实例。
- 数组类型最外面一层叫做该数组类型的组件类型,一个数组的组件类型也可以是数组。
- 引用类型的默认值null,当一个引用不指向任何对象时,它的值就用null来表示。