文章目录

  • 一、类加载初始化时机
  • 二、常量加载示例
  • 三、数组加载示例

一、类加载初始化时机


类加载时机 : Java 程序执行时 , 并不是一开始将所有的字节码文件都加载到内存中 , 而是用到时才进行加载 ;

  • 通过 new 关键字创建实例对象 ;
  • 通过 Class 反射 获取类 ; 如 : Class.forName(“Xxx”) 获取类 ;
  • 序列化 / 反序列化 ;
  • 调用 clone 克隆对象 ;
  • 有 main 函数的类 , 会默认自动加载 ;
  • 调用子类 , 如果之前没有加载过父类 , 则 自动加载父类 ;
  • 访问 类 的 静态变量

有些类加载操作 , 不需要执行 加载 -> 连接 ( 验证 , 准备 , 解析 ) -> 初始化 这个完整的流程 ;

如 : 如果是 public final static 修饰的常量值 , 在编译阶段 , 就会将该值放到常量池中 ; 在类加载的过程中 , 只要执行到 加载 -> 连接 ( 验证 , 准备 , 解析 ) 阶段 , 就可以完成常量池的初始化 , 即使没有执行 初始化 这个步骤 , 也不影响使用类中的常量值 ;

在 连接 的 准备 阶段 , 为 普通 的 静态变量 进行 默认赋值 , 但是针对 静态常量 , 直接进行 指定赋值 ;

但是 普通的 静态变量 的 指定赋值 , 是在 初始化 阶段 完成的 ;

类 在 " 初始化 " 阶段 , 调用 静态代码块 ;

二、常量加载示例


类加载时 , 如果只用到了类中的常量 , 则只进行 " 加载 -> 连接 ( 验证 , 准备 , 解析 ) " 两个过程 :

public class Student {// 常量public static final int age = 18;static {// 加载类的 " 初始化 " 阶段才执行 静态代码块//  如果只是进行了 " 连接 " , 没有进行 初始化 , 则不会调用该代码块System.out.println("Student 静态代码块调用");}
}

主函数 :

public class Main {public static void main(String[] args) {int age = Student.age;System.out.println("main 函数 age = " + age);}
}

执行结果 :

上述 Student 类中的 静态代码块 没有被执行 , 说明 类加载 的流程中 , " 初始化 " 步骤 , 没有被执行 ;

找到 Student.class 字节码文件 , 然后使用

javap -v -Student.class

查看该字节码文件的附加信息 ;

在 " 常量表 " 中 , 发现了常量值 181818 , 这个常量值是在编译阶段就编译到了字节码中 ; 在 " 连接 " 的 " 准备 " 阶段 , 该常量值就设置完毕 ; 出于最大限度性能优化的考虑 , 如果不使用该类的其它值 , 就不会执行 " 初始化 " 阶段 ; 因此这里不会调用 静态代码块 中的代码 ;

Constant pool:#10 = Integer            18

三、数组加载示例


对数组进行创建操作 , 如创建了一个对象数组 , 此时不会加载该对象对应的类 , 只会为其在内存分配空间 ;

创建数组时 , 触发的是 Student[] 数组类型的 类加载初始化 , 但是不会触发 Student 类的初始化操作 ;

如果调用数组中的元素时 , 就需要初始化 Student 类 ;

Student 类 :

public class Student {// 常量public static final int age = 18;static {// 加载类的 " 初始化 " 阶段才执行 静态代码块//  如果只是进行了 " 连接 " , 没有进行 初始化 , 则不会调用该代码块System.out.println("Student 静态代码块调用");}
}

main 函数 :

public class Main {public static void main(String[] args) {System.out.println("main 函数执行");Student[] students = new Student[2];}
}

执行结果 : 只是创建数组 , 只需要为其分配内存空间 , 不需要为每个 Student 数组元素赋值 , 这里不需要初始化 Student 类 ;

【Java 虚拟机原理】Java 类中的类加载初始化细节 ( 只使用类中的常量时加载类不会执行到 ‘初始化‘ 阶段 )相关推荐

  1. 《Java虚拟机原理图解》5. JVM类加载器机制与类加载过程

    参考网址:http://blog.csdn.net/luanlouis/article/details/50529868 0.前言 读完本文,你将了解到: 一.为什么说Jabalpur语言是跨平台的 ...

  2. java虚拟机原理(java虚拟机的基本结构)

    虚拟机的分类 虚拟机大体上分为系统虚拟机和程序虚拟机: 如:大名鼎鼎的VMware就属于系统虚拟机,VMware是完全对物理计算机的仿真,提供一个可以运行完整操作系统的软件平台: 程序虚拟机的代表就是 ...

  3. 28 Java类的加载机制、什么是类的加载、类的生命周期、加载:查找并加载类的二进制数据、连接、初始化、类加载器、双亲委派模型、自定义类加载器

    28Java类的加载机制 28.1.什么是类的加载 28.2.类的生命周期 28.2.1.加载:查找并加载类的二进制数据 28.2.2.连接 28.2.3.初始化 28.3.类加载器 28.4.类的加 ...

  4. java 加载类java_深入研究Java类加载机制

    深入研究Java类加载机制 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类加载机制的第二个目的是让程序能动态的控制类加载,比 ...

  5. Java反射-静态/动态加载类

    title: Java反射-静态/动态加载类 date: 2019-05-28 18:50:00Java反射-静态/动态加载类 Class 类是对象,是java.lang.Class类的实例对象.任何 ...

  6. java类索引_《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合...

    讲完了class文件中的常量池,我们就相当于克服了class文件中最麻烦的模块了.现在,我们来看一下class文件中紧接着常量池后面的几个东西:访问标志.类索引.父类索引.接口索引集合. 1. 访问标 ...

  7. java虚拟机标志_《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合...

    讲完了class文件中的常量池,我们就相当于克服了class文件中最麻烦的模块了.现在,我们来看一下class文件中紧接着常量池后面的几个东西:访问标志.类索引.父类索引.接口索引集合. 1. 访问标 ...

  8. 深入理解Java虚拟机之Java类加载机制,Java类实例化过程详解。

    目录 Java类加载机制 类加载过程 加载(Loading) 连接(Linking) 初始化(Initialzation) 使用(Useing) 卸载(Unloading) 引言 什么情况下开始类加载 ...

  9. 【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )

    文章目录 前言 一.访问和修饰标志 二.类索引 三.父类索引 四.接口计数器 五.接口表 六.字段计数器 七.字段表 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 二 ( ...

最新文章

  1. 兰州市职称计算机考试地点,兰州2013年职称计算机考试报名等事项的通知
  2. hdu4950 打怪(简单题目)
  3. 第一百一十二期:96秒100亿!如何抗住双11高并发流量?
  4. plsql删除大量数据_一次oracle大量数据删除经历
  5. VS2005的几款代码皮肤。
  6. android基础入门布局讲解(2)
  7. 运维学习之自动化安装系统的配置
  8. 230. 二叉搜索树中第K小的元素
  9. python not_刚接触Python,python中not in怎么解释?求解释一下?
  10. 关于Multi-bin实现的一些翻译
  11. 海定计算机计算标准差,方差 标准差
  12. 免费空间(免备案,无广告) 1G免费全能空间
  13. Shell脚本文本三剑客之Sed
  14. Android手机哪个悬浮好用,别羡慕苹果了,安卓悬浮神器比 iPhone 好用太多!
  15. 雪球结构定价与风险深度分析
  16. 计算机电源输出电压 电流,电脑USB接口的输出电压以及电流你知道吗?
  17. iOS7 edgesForExtendedLayout
  18. 2020第二届金融科技大会在沪成功召开, “大数据百强榜”重磅出炉!
  19. 为什么Arduino UNO工作电压是5V,但是需要9V的电源适配器
  20. python培训就业班的服务好不好,在培训班学完Python为什么不好就业?

热门文章

  1. 使用jQuery卸载绑定的事件
  2. CSS中overflow:scroll怎么设置只上下滚动而不左右滚动
  3. 80客团队博客建设的思路
  4. Socket.IO 客户端 API IO
  5. vue2.x的小问题
  6. Spring AOP通知实例 – Advice
  7. Web前端开发css基础样式总结
  8. mysql字段中ID值自动增长
  9. Asp.net 服务器端控件
  10. xp下msn8.5无法安装的解决办法