08章类的生命周期讲解.ppt

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
08章类的生命周期讲解

Chap 8 类的生命周期 议题 Java虚拟机及程序的生命周期 类的加载、连接和初始化 类加载器 类的卸载 Java虚拟机及程序的生命周期 Java虚拟机为Java程序提供运行时环境,其中一项重要的任务就是管理类和对象的生命周期。类的生命周期从类被加载、连接和初始化开始,到类被卸载结束。 当通过一个java命令运行一个Java程序时,就启动了一个Java虚拟机进程。Java虚拟机进程从启动到终止的过程,称为Java虚拟机的生命周期。 Java虚拟机处于生命周期中时,它的总任务是运行Java程序。Java程序从开始运行到终止的过程称为程序的生命周期,它和Java虚拟机的生命周期是一致的。 结束生命周期的几种情况 在以下情况下,Java虚拟机将结束生命周期: 程序正常执行结束。 程序在执行中因为出现异常或错误而异常终止。 执行了System.exit()方法。 由于操作系统出现错误而导致Java虚拟机进程终止。 议题 Java虚拟机及程序的生命周期 类的加载、连接和初始化 类加载器 类的卸载 类的加载、连接和初始化 当Java程序需要使用某个类时,Java虚拟机会确保这个类已经被加载、连接和初始化。这些步骤是必须严格地按以下顺序执行: 加载:查找并加载类的二进制数据。 连接:包括验证、准备和解析类的二进制数据。 验证:确保被加载类的正确性。 准备:为类的静态变量分配内存,并将其初始化为默认值。 解析:把类中的符号引用转换为直接引用。 初始化:把类的静态变量赋予正确的初始值。 类的加载 类的加载是指把类的.class文件中的二进制数据读入到内存中,把它存放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。 Java虚拟机能够从多种来源加载类的二进制数据,包括: 从本地文件系统中加载类的.class文件,这是最常见的加载方式。 通过网络下载类的.class文件。 从ZIP、JAR或其他类型的归档文件中提取.class文件。 从一个专有数据库中提取.class文件。 把一个Java源文件动态编译为.class文件。 类的加载的最终产品是位于运行时数据区的Class对象。Class对象封装了类在方法区内的数据结构,并且向Java程序提供了访问类在方法区内的数据结构的接口。 类的连接 当类被加载后,就进入连接阶段。连接就是把已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去。连接的第一步是类的验证。 类的验证能提高程序的健壮性。 类的验证主要包括以下内容: 类文件的结构检查:确保类文件遵从Java类文件的固定格式。 语义检查:确保类本身符合Java语言的语法规定,比如验证final类型的类没有子类,以及final类型的方法没有被覆盖。 字节码验证:确保字节码流可以被Java虚拟机安全地执行。 二进制兼容的验证:确保相互引用的类之间协调一致。 在准备阶段,Java虚拟机为类的静态变量分配内存,并设置默认的初始值。 在解析阶段,Java虚拟机会把类的二进制数据中的符号引用替换为直接引用。 类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值。 Java虚拟机初始化一个类包含以下步骤: 假如这个类还没有被加载和连接,那就先进行加载和连接。 假如类存在直接的父类,并且这个父类还没有被初始化,那就先初始化直接的父类。 假如类中存在初始化语句,那就依次执行这些初始化语句。 当初始化一个直接父类时,也需要重复以上步骤,这会确保当程序主动使用一个类时,这个类及所有父类(包括直接父类和间接父类)都已经被初始化。 程序中第一个被初始化的类是Object类。 类的初始化时机——主动使用 Java虚拟机只有在程序首次主动使用一个类或接口时才会初始化它。只有以下6种活动被看做是程序对类或接口的主动使用。 创建类的实例。 调用类的静态方法。 访问某个类或接口的静态变量,或者对该静态变量赋值。 调用Java API中某些反射方法,比如调用Class.forName(“Worker”)方法。 初始化一个类的子类。 Java虚拟机启动时被标明为启动类的类。例如对于“java Sample”命令,Sample类就是启动类,Java虚拟机会先初始化它。 类的初始化时机——被动使用 使用Java类的方式还有被动使用,它不会导致类的初始化。 对于final类型的静态变量,如果在编译时就能计算出变量的取值,那么这种变量被看做编译时常量。Java程序中对类的编译时常量的使用,被看做是对类的被动使用。 对于final类型的静态变量,如果在编译时不能计算出变量的取值,那么程序对类的这种变量的使用,被看做是对类的主动使用。 当Java虚拟机初始化一个类时,要求它的所有父类

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档