JVM规范二(数据类型)

来源:互联网 发布:支付宝如何登陆淘宝 编辑:程序博客网 时间:2024/05/16 08:35

跟java程序语言一样,Java虚拟机同样也支持两种数据类型:基本类型和引用类型,同样有两种对应的类型值存储在这两种变量中,可被当做参数传递,方法返回或者直接操作。

Java虚拟机希望几乎所有的类型检查都在运行时前完成。通常应该由一个叫做编译器的完成,而不应该是Java虚拟机本身完成。基本类型的值需要能够在运行时检查他们的类型和同引用类型的值区分。

Java虚拟机明确包含了对于对象的支持。一个对象要么是一个动态分配的类实例,要么是一个数组。指向一个对象的引用即是Java虚拟机的引用类型。引用类型的值可以看成是对象的指针,一个对象可以同时存在多个引用。

Primitive Types and Values

Java虚拟机支持的基本类型有数值类型、boolean类型、returnAddress类型 。

数值类型有整型和浮点型组成,其中整型包含:

  • byte:有符号8 bit整数值,默认值为0。
  • short:有符号16 bit整数值,默认值为0。
  • int:有符号32 bit整数值,默认值为0。
  • long:有符号64 bit整数值,默认值为0。
  • char:16 bit无符号整数,默认值为空的表示’\u0000’。

浮点类型为:

  • float:单精度浮点数
  • double:双精度浮点数

boolean类型只有两个值true和false,默认值为false.

returnAddress类型是指向Java虚拟机指令操作码的指针。

在所有基本类型数据中,只有returnAddress类型与java程序语言无关联。

Integral Types and Values

Java虚拟机的整型数值范围如下:

  • byte:[-128,127]
  • short:[-32768,32767]
  • int:[-2147483648,2147483647]
  • long:[-9223372036854775808,9223372036854775807]
  • char:[0,65535]

Floating-Point Types, Value Sets, and Values

浮点型分为32 bit单精度float类型与64bit双精度double类型(IEEE Standard for Binary Floating-Point
Arithmetic (ANSI/IEEE Std. 754-1985, New York))。

IEEE 754标准不仅包含小数值,还包含正负0,正负无穷大和一个特别的非数字(NaN)。NaN常用来表示无效操作的结果。比如0除0。

第个java虚拟机的实现都要浮点类型的两种标准集,叫做float value set和double value set。另外虚拟机的实现也可能实现其他浮点值集(指数形式)。

The returnAddress Type and Value

returnAddress类型被用于Java虚拟机的jsr,ret,jsr_w指令,returnAddress类型的值是指向JAVA虚拟机指令集操作码的指针。与数值类型的基本类型不一样,returnAddress类型不与Java程序语言中的任何类型对应,并且不能被运行的程序修改。

The boolean Type

尽管Java虚拟机定义了boolean类型,但对它仅提供了有限的支持。并没有单独的虚拟机指令专门操作boolean类型的值。Java程序语言中对boolean操作的表达式都是使用Java虚拟机的int数据类型编译的。

Java虚拟机直接支持boolean类型的数组,它的newarry指令允许boolean数组的创建。boolean类型的数组的访问和修改则是使用byte数组指令baload和bastore。

注:在Oracle的Java虚拟机实现中,Java程序语言中的boolean数组被编码为Java虚拟机的byte数组,每个boolean元素使用8bits。

Java虚拟机在编码boolean数组组件时,使用1表示true,使用0表示false。

Reference Types and Values

引用类型有三种:class类型、数组类型、interface类型,各自对应的引用值为动态创建的类实例、数组、实现接口的类实例或者数组。

一个数组是由一个一维的组件类型组成,此组件类型可能还是数组。所以对于数组,首先要考虑其组件类型,然后如果组件类型还是数组则一直找下去,最后找到其非数组类型的组件类型,被称为元素(Element)。数组的元素类型要么是基本类型,要么是一个class类型,要么是一个interface类型。

如果一个引用类型为空引用,或者说没有引用对象,用null表示。null引用初始化时没有运行时类型,但可以转换为任意类型引用类型的默认值是null。