创建对象时发生的那些事儿

对象的实例化过程

  • 如图是JVM的完整框图

在这里插入图片描述

  • [1] :是类加载阶段,类加载的过程一共有三个阶段:(1)加载阶段、(2)链接阶段、(3)初始化阶段。加载 .class文件时,采用的是双亲委派机制。
    • (1)加载阶段: 通过该类的全限定名拿到该类的二进制字节流,之后将该字节流所代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
    • (2)链接阶段分为三步:验证、准备、解析。
      • 验证(Verify):文件格式验证,元数据验证,字节码验证,符号引用验证。例如字节码文件,其开头均为CAFE BABE。
      • 准备(Prepare):为类(static)变量分配内存并且设置该类变量的默认初始值,即零值;不包含用final修饰的static,因为final在编译的时候就会分配好了默认值,准备阶段会显式初始化;不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中。
      • 解析(Resolve):将常量池内的符号引用转换为直接引用的过程;事实上,解析操作往往会伴随着JVM在执行完初始化之后再执行;符号引用就是一组符号来描述所引用的目标。符号引用的字面量形式明确定义在《java虚拟机规范》的class文件格式中。直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄;解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等。对应常量池中的CONSTANT Class info、CONSTANT Fieldref info、CONSTANT Methodref info等。
    • (3)初始化阶段:为静态变量赋值,执行static代码块。初始化阶段就是执行类构造器方法<clinit>()的过程,当我们代码中包含static变量的时候,就会有clinit方法,构造器方法中指令按语句在源文件中出现的顺序执行
/**
 * 例子如下:静态变量number值的变化过程为:number = 0 --> initial: 10 --> 15
 * 1:链接linking的prepare这个过程:为类(static)变量分配内存并且设置该类变量的默认初始值 number = 0
 * 2:初始化:顺序执行  number = 0 --> initial: 10 --> 15
 */
public class ClassTest {
    //@初始化阶段 先执行number = 10
    private static int number = 10;
    static {
      	//再执行number = 15 顺序执行
        number = 15;
    }
    public static void main(String[] args) {
      	//打印为15
        System.out.println(ClassTest.number);
    }
}

对象的创建过程

  • 对象创建的方式

    在这里插入图片描述

  • 创建对象的步骤
    在这里插入图片描述

//[方法区]  [栈:局部变量表]   =   [堆] 
  Object     obj           =   new Object();
  • 给对象属性赋值的顺序为:

    1. 属性的默认值初始化

    2. 显示初始化/代码块初始化(并列关系,谁先谁后看代码编写的顺序)

    3. 构造器初始化

class InitTest {
    String name;
  	//1. 属性的默认值初始化
    int age = 1001;
    Student stu;
    {
      	//2. 显示初始化/代码块初始化(并列关系,谁先谁后看代码编写的顺序)
        name = "张三";
    }
    public InitTest(){
        //3. 构造器初始化
        stu = new Student();
    }
}
class Student {}

对象的访问方式

  • 句柄访问
    • 缺点:在堆空间中开辟了一块空间作为句柄池,句柄池本身也会占用空间;通过两次指针访问才能访问到堆中的对象,效率低。
    • 优点:reference中存储稳定句柄地址,对象被移动(垃圾收集时移动对象很普遍)时只会改变句柄中实例数据指针即可,reference本身不需要被修改。
  • 直接指针(HotSpot采用)
    1. 优点:直接指针是局部变量表中的引用,直接指向堆中的实例,在对象实例中有类型指针,指向的是方法区中的对象类型数据。
    2. 缺点:对象被移动(垃圾收集时移动对象很普遍)时需要修改 reference 的值。
已标记关键词 清除标记
内容简介   本书通过引用UML规格书里的图例和定义详细介绍了UML的特色和发展历史,六类UML图,元模型的说明,并且以StarUML为示范,讲解UML,工具如何落实UML概念,还介绍了活动图、控制节点、交互图、生命线、用例图等内容。   本书可作为高等院校计算机专业的教材和参考书,也可作为各类希望了解UML的人员的参考书。 目录 前言 第1章 UML概述 1.1 语言与方法 1.2 图形语言 1.3 国际标准 1.4 面向对象 第2章 六类UML图 2.1 类图 2.1.1 类 2.1.2 可见性 2.1.3 关联 2.1.4 多重性 2.1.5 聚合与组合 2.1.6 泛化 2.1.7 依赖 2.1.8 接口 2.1.9 注释 2.2 对象图 2.3 包图 2.3.1 包 2.3.2 元素导入 2.3.3 包导入 2.3.4 包合并 2.4 活动图 2.4.1 动作与控制流 2.4.2 对象节点与对象流 2.4.3 活动参数节点 2.4.4 引脚 2.4.5 起点与终点 2.4.6 合并 2.4.7 判断 2.5 序列图 2.5.1 交互 2.5.2 生命线 2.5.3 执行发生 2.5.4 消息 2.5.5 终止 2.5.6 一般次序 2.5.7 状态不变式 2.6 用例图 2.6.1 用例与执行者 2.6.2 包含关系 2.6.3 扩展关系 2.6.4 扩展点 第3章 类图(一) 3.1 根基 3.1.1 元素 3.1.2 关系 3.1.3 有向关系 3.1.4.注释 3.2 名称空间 3.2.1 具名元素 3.2.2 名称空间 3.2.3 可见性种类 3.2.4 装包元素 3.2.5 元素导入 3.2.6 包导入 3.3 多重性 3.3.1 多重性元素 3.3.2 类型与类型元素 3.4 表达式 3.4.1 值规格 3.4.2 表达式 3.4.3 不透明表达式 3.4.4 文字规格 3.4.5 实例值 3.5 约束 第4章 类图(二) 4.1 实例 4.1.1 实例规格 4.1.2 槽 4.2 类元 4.2.1 定义 4.2.2 泛化 4.2.3 可重定义元素 4.3 特征 4.3.1 定义 4.3.2 结构特征 4.3.3 行为特征 4.3.4 参数 4.3.5 参数方向种类 4.4 操作 4.5 类 4.5.1 定义 4.5.2 性质 4.5.3 关联 4.5.4 聚合种类 第5章 类图(三) 5.1 数据类型 5.1.1 定义 5.1.2 基本类型 5.1.3 枚举与枚举文字 5.2 包 5.2.1 定义 5.2.2 包合并 5.3 依赖 5.3.1 依赖与具名元素 5.3.2 使用关系 5.3.3 许可 5.3.4 抽象 5.3.5 实现 5.3.6 替代和类元 5.4 接口 5.4.1 实现和行为类元 5.4.2 接口定义 第6章 活动图 6.1 流程 6.1.1 活动节点与活动边 6.1.2 控制流 6.1.3 对象流 6.2 节点 6.2.1 活动 6.2.2 执行节点与动作 6.2.3 对象节点 6.2.4.活动参数节点 6.3 动作 6.3.1 引脚 6.3.2 输出引脚与输入引脚 6.3.3 值引脚 6.4 控制节点 6.4.1 定义 6.4.2 起始节点 6.4 _3终止节点与活动终点 6.4.4 合并节点 6.4.5 判断节点 第7章 交互图 7.1 交互 7.2 消息 7.2.1 消息与消息端 7.2.2 消息种类与消息性质 7.2.3 事件发生与执行发生 7.2.4 一般次序 7.3 生命线 7.3.1 定义 7.3.2 状态不变式 7.3.3 终止 第8章 用例图 8.1 用例与类元 8.2 关联与泛化 8.3 执行者 8.4 包含关系 8.5 扩展关系 8.6 扩展点 第9章 杂项 9.1 基本类型 9.2 UML图 9.2.1 图框 9.2.2 13类图 9.3 共同行为 9.3.1 行为 9.3.2 行为类元 9.3.3 活动 9.3.4 不透明表达式 9.4 构造型 9.4.1 辅助与焦点一 9.4.2 元类 9.4.3 类型与实现类 9.4.4 工具 9.4.5 派生 9.4.6 精化 9.4.7 追踪 9.4.8 实例 9.4.9 创建 9.4.10 调用 9.4.11 发送 9.4.12 责任 9.4.13 创建 9.4.14 销毁 9.4.15 框架 9.4.16 模型库 9.4.17 实现 9.4.18 建造组件 9.4.19 脚本
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页