java虚拟机结构(概览一)
1、 class文件格式
编译后被java虚拟机所执行的代码使用了一种平台中立(不依赖于特定硬件及操作系统)的 二进制格式来表示,并且经常(但非绝对)以文件的形式存储,因此这种格式称为class文件格式。class文件格式中精确地定义了类和接口的表示形式,例如字节序(byte ordering)。 这种class文件格式是java能够跨平台的原因和保证
2、 数据类型
与java程序语言中的数据类型相似,java虚拟机可以操作的数据类型分为两类:原始类型(primitive type,或叫做基本类型、原生类型)和引用类型(reference type)。与之对应,也存在原始值(primitive value)和引用值(reference value)两种类型的数据,他们可用于变量赋值、参数传递、方法返回和运算操作。
2.1、 基本类型与值
java虚拟机所支持的原始数据类型包括数值类型(numeric type)、boolean类型和returnAddress类型(JDK7以后名存实亡)三类。 数值类型又分为整数类型(integral type)和浮点类型(floating-point type)两种。 整数类型包括:
byte类型:值为8位有符号二进制补码整数,默认值为零 short类型:值为16位有符号二进制补码整数,默认值为零 int类型:值为32位有符号二进制补码整数,默认值为零 long类型:值为64位有符号二进制补码整数,默认值为零 char类型:值为使用16为无符号整数表示的、指向基本多文种平面(BMP)的Unicode码点,以UTF-16编码,默认值为Unicode的null码点('\u0000')。
浮点类型包括:
float类型:值为单精度浮点数集合中的元素,或者(如果虚拟机支持的话)是单精度扩展指数(float-extended-exponent)集合中的元素,默认值为正数0。 double类型:值为双精度浮点数集合中的元素,或者(如果虚拟机支持的话)是双精度扩展指数(double-extended-exponent)集合中的元素,默认值为正数0。
boolean类型的值为布尔值true和false,默认值为false。
2.1.1、整数类型与整数值
java虚拟机中的整数类型的取值范围如下:
对于byte类型,取值范围是-128~127(-2^7~2^7-1),包括-128和127. 对于short类型,取值范围是-32768~32767(-2^15~2^15-1),包括-32768和32767。 对于int类型,取值范围是-2147483648~2147483647(-2^31~2^31-1),包括-2147483648和2147483647。 对于long类型,取值范围是-9223372036854775808~9223372036854775807(-2^63~2^63-1),包括-9223372036854775808和9223372036854775807 对于char类型,取值范围是0~65535,包括0和65535.
2.1.2、 boolean类型
虽然java虚拟机定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在java虚拟机中没有任何供boolean值专用的字节码指令,java语言表达式所操作的boolean值,在编译后都直接使用了java虚拟机中的int数据类型来代替。如true值采用1来表示,false值采用0来表示。
2.2.3、 引用类型与值
java虚拟机中有三种引用类型:类类型(class type)、数组类型(array type)和接口类型(interface type)。这些引用类型的值分别指向动态创建的类实例、数组实例和实现了某个接口的类实例或数组实例。 数组类型最外面的那一维元素的类型(此维度的长度不由数组类型来决定),叫做该数组类型的组件类型(component type)。一个数组的组件类型也可以是数组。从任意一个数组开始,如果发现其组件类型也是数组类型,那就继续取这个小数组的组件类型,不断执行这样的操作,最终一定可以遇到组件类型不是数组的情况,这时就把这种类型称为本数组类型的元素类型(element type)。数组的元素类型必须是基础类型、类类型或者接口类型之一。 在引用类型的值中还有一个特殊的值:null,当一个引用不指向任何对象的时候,它的值就用null来表示。一个为null的引用,起初并具备任何实际的运行期类型,但是它可转型为任意的引用类型。引用类型的默认值就是null。 java虚拟机规范并没有规定null在虚拟机实现中应当怎样用编码来表示。