`

第二章(一) Java虚拟机结构-数据类型

阅读更多
    这篇文章针对虚拟机的抽象描述,并不针对一个特定的Java虚拟机实现。
    为了实现Java虚拟机,你仅仅需要能够读取class文件格式,并且执行里面的操作。哪些限制实现者创造力的具体细节并不是Java虚拟机规范的一部分。例如,运行时数据区域的内存结构,垃圾回收运用的算法,Java虚拟机指令的内部优化(例如转换成机器码)等这些实现细节都留给实现者去自由决断。
    虚拟机规范中所有的Unicode码都是采用The Unicode Standard, Version 6.0.0,可以在http://www.unicode.org/.获得。
2.1 类文件格式
    虚拟机中执行的编译后的代码是一种与硬件和操作系统无关的二进制格式,通常情况下(但不是必须)存储在文件中,即大家熟知的class文件。这种class文件格式精确的定义了类和接口的表示,比如包含用于确保平台特有的对象文件的字节顺序。
    第四章 会再次详细讨论类文件的格式
2.2 数据类型
    类似于Java编程语言,Java虚拟机也是在两种数据类型上进行操作:基本数据类型和引用数据类型。相应的存在两种数值可以被存储到变量中、作为参数传递、作为方法返回值、被操作:基本数值和引用数值。
    Java虚拟机期望所有的类型检测都在运行前被执行,通常是靠编译器,而不是靠虚拟机自己来做。基本类型不需要被标记,或者能够被检测出以用来在运行时确定其类型,也不需要和引用类型的值区分开来。相反,Java虚拟机的指令集用操作特定类型的指令来区分被操作数值的类型。例如:iadd, ladd, fadd, 和 dadd都是用来操作两个数,并算出一个数值的指令集,但是每一个都相应的专门针对它操作的类型 int,long,float,double。可以参照2.11.1查阅Java虚拟机支持的指令集的概述。
    Java虚拟机明确的包含了对对象的支持。一个对象是一个动态分配的类实例或者是一个数组。一个对象的引用被认为是Java虚拟机的引用类型。引用类型的值可以想成一个对象的指针。同一个对象可以有多个引用。对象通常利用引用类型来操作、传递、测试。
2.3 基本类型和值
    Java虚拟机包支持的数据类型有:数字类型、boolean类型(2.3.4)、returnAddress类型(2.3.3)。
    数字类型又分为整数类型(2.3.1)和浮点数类型(2.3.2)。
    整数类型有:
 

     
  • byte :8位的有符号整数,默认值是0
  •  
  • short:16位的有符号整数,默认值是0
  •  
  • int  :32位的有符号整数,默认值是0
  •  
  • char :16位的无符号整数,采用UTF-16来编码,默认值是'\u0000'
  •  
  • long :64位的有符号整数,默认值是0
  •  

    浮点数类型有:
 

     
  • float :值是浮点数集的元素,如果虚拟机支持也可以是浮点数扩展指数集,默认值是正0
  •  
  • double:值是双精度数集的元素,如果虚拟机支持也可以是双精度数扩展指数集,默认值是正0
  •  

  boolean类型的值表示true和false,默认值是false。
  returnAddress类型的值是Java虚拟机指令集的操作码的指针,在所有的基本数据类型中,只有returnAddress类型在Java编程语言中没有直接对应的类型。
2.3.1 整数类型和值
    对于Java虚拟机整数类型的值有:
 
  • byte  :范围是[-128,127]
  • short :范围是[-32768,32767]
  • int   :范围是[-2147483648,2147483647]
  • long  :范围是[-9223372036854775808,9223372036854775807]
  • char  :范围是[0,65535]

2.3.2 浮点类型和值
    浮点数类型包含float和double,概念上等价于32位的单精度数和64位的双精度数,采用IEEE 754标准格式。
    IEEE 754标准不仅包含正负有符号数,还有正0和负0,正无穷和负无穷,以及一个特殊的NaN值。NaN用来代表一个非法操作的结果,例如0除0的结果。
2.3.3 returnAddress类型和值
    returnAddress类型被Java虚拟机的jsr, ret, 和 jsr_w指令利用。它的值表示Java虚拟机指令操作码的地质。不像数值基本类型,returnAddress类型没有对应的Java语言类型。它的值也不能被运行程序修改。
2.3.4 boolean类型
    虽然Java虚拟机定义了boolean类型,但是它对boolean类型只提供了非常有限的支持。并没有专门操作boolean类型的指令。Java语言中操作boolean类型的表达式编译后利用的是Java虚拟机的int类型。
    Java虚拟机并不直接支持boolean数组,newarray 指令能够创建一个新的boolean数组,但是虚拟机对boolean数组的访问和修改用的是字节数组的指令baload和bastore。
    Java虚拟机用1表示true,0表示false来编码boolean数组的内容,如果Java编程语言的boolean类型值被编译映射成虚拟机的int类型,编译器也需要用相同的编码格式。
2.4 引用类型
    引用类型分为三类:类、数组、接口。相应的它们的值对应着动态生成的类实例、数组和实现了接口的类实例或数组。
    数组类型由一维的组件类型组成,数组类型的组件类型自己也可以是数组。如果数组的组件类型也是数组,则组件类型的组件类型最终必然不是一个数组,称之为元素类型。元素类型只能是类类型、接口类型、或基本类型。
    引用类型的值也可以是一个特殊的null,一个不指向任何对象的引用,即null引用。null引用没有运行时类型,但是可以转换成任意类型。引用类型的默认值就是null。
    虚拟机规范并不强制要求使用一个具体的值编码为null。
 
分享到:
评论

相关推荐

    第二章Java虚拟机

    java体系结构,java虚拟机,虚拟机中的数据类型

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

     本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行引擎等;第5-20章深入描述了java技术的内部细节,包括垃圾收集、java安全模型、java的连接模型和动态扩展机制、class文件、运算及...

    【带书签】Java虚拟机规范(Java SE 7).pdf

    了Java虚拟机整体架构,包括class文件格式、数据类型、原始类型、引用类型、运行时数据区、栈帧、浮点算法、异常等,这对理解本书后面的内容有重要帮助。第3章详述如何将Java语言编写的程序转换为Java虚拟机指令集,...

    深入Java虚拟机

    3.4.2 第二趟:类型数据的语义检查 3.4.3 第三趟:字节码验证 3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 Java虚拟机中内置的安全特性 3.6 安全管理器和Java API 3.7 代码签名和认证 ...

    深入java虚拟机第二版

    深入java虚拟机第二版 第1章 Java体系结构介绍 1.1 为什么使用Java 1.2 网络带来的挑战和机遇 1.3 体系结构 1.3.1 Java虚拟机 1.3.2 类装载器的体系结构 1.3.3 Java class文件 1.3.4 Java API 1.3.5 ...

    深入JAVA虚拟机(第2版)

    3.4.2 第二趟:类型数据的语义检查 3.4.3 第三趟:字节码验证 3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 Java虚拟机中内置的安全特性 3.6 安全管理器和Java API 3.7 代码签名和认证 ...

    Java虚拟机

    6.4.1 字节码与数据类型 6.4.2 加载和存储指令 6.4.3 运算指令 6.4.4 类型转换指令 6.4.5 对象创建与访问指令 6.4.6 操作数栈管理指令 6.4.7 控制转移指令 6.4.8 方法调用和返回指令 6.4.9 异常处理指令 ...

    Java虚拟机规范(Java SE 7)

    第2章 Java虚拟机结构 ................................................. 21 2.1 Class文件格式 ................................................. 21 2.2 数据类型 .............................................

    Java虚拟机规范(Java SE 7).pdf

    第2章 Java虚拟机结构 ................................................. 21 2.1 Class文件格式 ................................................. 21 2.2 数据类型 .............................................

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    第2章 Java内存区域与内存溢出异常 / 24 2.1 概述 / 24 2.2 运行时数据区域 / 25 2.2.1 程序计数器 / 25 2.2.2 Java虚拟机栈 / 26 2.2.3 本地方法栈 / 27 2.2.4 Java堆 / 27 2.2.5 方法区 / 28 2.2.6 运行...

    Java开发技术大全(500个源代码).

    HelloWorldApp.java 第一个用Java开发的应用程序。 firstApplet.java 第一个用Java开发的Applet小程序。 firstApplet.htm 用来装载Applet的网页文件 第2章 示例描述:本章介绍开发Java的基础语法知识。 ...

    java初学者必看

    1.7.1 虚拟机数据类型 1.7.2 Java虚拟机的生命周期 1.7.3 Java虚拟机的体系结构 1.8 垃圾收集器 1.9 本章习题 第2章 Java开发环境 2.1 J2SE的下载和安装 2.1.1 J2SE的下载 2.1.2 J2SE的安装 2.2 环境变量的...

    计算机网络课程设计实验报告.docx.docx

    ---P13 运行结果 --------P19 第五章 心得体会 --------P21 总体设计 实体类设计 TCP、UPD、ICMP、ARP、广播数据包五个包的数据结构设计 功能类设计 网卡获取 包的抓捕 包的处理 界面设计 布局 按钮功能连接 第二章 ...

    深入理解Android:卷I--详细书签版

    5.2.2 第二板斧——由弱生强 103 5.2.3 第三板斧——破解生死魔咒 106 5.2.4 轻量级的引用计数控制类LightRefBase 108 5.2.5 题外话——三板斧的来历 109 5.3 Thread类及常用同步类分析 109 5.3.1 一个变量...

    Java语言基础下载

    第二章: 面向对象概述 15 学习目标 15 面向对象(Object Oriented) 16 面向对象的主要特性 18 抽象(Abstraction) 18 封装(Encapsulation): 19 多态(Polymorphism) 20 面向对象的优点 22 面向对象的分析、设计和编程...

    其实你应该这样学Java 源代码

    第一部分讲解了Java的基本特点和运行原理,Java虚拟机和JDK+JCreator的开发环境,Java程序代码的特点,Java语言中的运算符和表达式,Java的基本数据类型,Java语句流程,如顺序语句、选择语句、循环语句、跳转语句等...

    java基础案例与开发详解案例源码全

    2.5 Java虚拟机简介28 2.6 Java技术两种核心运行机制29 2.7 上机练习30 第3章 3.1 变量32 3.1.1 什么是变量32 3.1.2 为什么需要变量32 3.1.3 变量的声明和赋值33 3.1.4 变量应用实例33 3.2 数据的分类34 3.2.1 Java...

    张孝祥Java就业培训教程.pdf

    在第二章中,全面地讲解Java的基本语法知识,对基本语法的讲解也不是泛泛而谈,而是在其中贯穿各种实际应用中的巧妙用法和注意事项。在第三章和第四章中,透彻系统地讲解了面向对象的思想和应用。在以后的章节中,用...

    编程新手真言......

    2.16 数据类型和数据结构是二种不一样的东西 69 2.17 为什么需要变量这些东东 69 2.18 面向类型化的设计和面向无类型泛化的设计-OO不是银弹 70 第3章 语言之争 71 3.1 学编程之初,语言之争 71 3.2 语言与应用与人(1...

Global site tag (gtag.js) - Google Analytics