本篇主要讲解类的初始化,也就是上图红框的部分。

类的初始化都做了哪些事呢?

一、初始化:

1.初始化阶段就是执行类构造器方法<clinit>() 的过程。

2.此方法不需要定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来。

发现只要有类变量的赋值和静态代码块,系统默认生成<clinit>() 方法。

看如下代码:

它的字节码文件:

就会发现没有<clinit>()方法。

3.构造器方法中指令按语句在源文件中出现的顺序进行执行。

4.<clinit>() 不同于类的构造器,一旦一个类进行声明后,系统默认会生成该类的无参构造器,也就对应的是字节码文件中的<init>() 方法。

5.若该类具有父类,JVM 会保证子类的<clinit>() 执行前,父类的<clinit>() 已经执行完毕。

如上图,执行ClinitTest1的main() 方法,首先会进行ClinitTest1 加载到内存中,然后进行链接,初始化完成后,调用它的main() 方法执行打印输出Son.B,又

由于Son 继承Father类,会先执行Father类的<Clinit>() 方法,将A=1,在执行静态代码块,A=2,再去执行Son的<clinit>() 方法,将A=2的值赋值给B,最后输出

B的值为2.

6. 虚拟机必须保证一个类的<clinit>() 方法在多线程下被同步加锁,也就是一个类只会被加载一次。存放到方法区中,并进行缓存。

二、初始化时机:(也就是何时才会进行初始化):

三、虚拟机自带的加载器:

1、启动类加载器(引导类加载器,Bootstrap ClassLoader):

a.这个类加载使用c/c++ 语言实现的,嵌套在JVM 内部。

b.它是来加载Java的核心库(JAVA_HOME/jre/lib/rt.jar、resources.jar 或sun.boot.class.path 路径下的内容),用于提供JVM自身需要的类

如下图代码:

运行结果:

c.并不继承java.lang.ClassLoader,没有父类加载器。

d.加载扩展类和应用程序类加载器,并指定为他们的父类加载器。

e.出去安全考虑,Bootstrap 启动类加载器只加载包名为java、javax、sun 等开头的类。

2、扩展类加载器:

a、Java语言编写,由sun.misc.Launcher$ExtClassLoader实现。

b、派生于ClassLoader

c、父类加载器为启动类加载器。

d、从java.ext.dirs 系统属性所指定的目录中加载类库,或从JDK的安装目录的jre/lib/ext子目录下加载类库,如果用户创建的jar放在此目录下,也会自动由扩展类加载器加载。

如下图代码:

运行结果:

3、应用程序类加载器(系统类加载器,AppClassLoader)

a、java语言编写,由sun.misc.Launcher$AppClassLoader实现

b、派生于ClassLoader类

c、父类加载器为扩展类加载器。

d、它负责加载环境变量classpath 或系统属性 java.class.path 指定路径下的类库。

e、该类加载时程序 默认的类加载器,一般来说,java 应用的类都是由他来加载完成的

f、通过ClassLoader#getSystemClassLoader() 方法可以获取到该类加载器

JVM之类的加载过程(三):初始化——>Initialization相关推荐

  1. 类的加载过程三:Initialization

    package com.leon.java;public class ClassInitTest {private static int num = 1;static{num = 2;number = ...

  2. JVM——类的加载过程

    附一张图方便理解,一个类的执行过程 类的加载过程,简明的来说 类装饰器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: 装载:查 ...

  3. JVM:类的加载过程

    文章目录 类的生命周期 一.加载 二.连接 1.验证 2.准备 3.解析 三.初始化 四.卸载 类的生命周期 一个类的完整生命周期如下: Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟 ...

  4. probe 加载过程 和初始化关系

    1.probe 是进程里面跑的吗? 2.probe 可以睡眠吗?睡眠后怎么被再次唤醒并继续执行? 3.probe 调度和执行顺序 4.probe 没跑完 系统怎处理 probe 是驱动用的探测函数,明 ...

  5. Trembling ! Java类的加载过程详解(加载验证准备解析初始化使用卸载)

    [1]类的生命周期 一个类从加载进内存到卸载出内存为止,一共经历7个阶段: 加载->验证->准备->解析->初始化->使用->卸载 其中,类加载包括5个阶段: 加载 ...

  6. 框架源码专题:springIOC的加载过程,bean的生命周期,结合spring源码分析

    文章目录 1.BeanFactory和ApplicationContext的区别? 2. IOC与 Bean的加载过程 ①:初始化容器DefaultListableBeanFactory ②:创建读取 ...

  7. 从JVM看类的加载过程与对象实例化过程

    一. 类的加载过程 1. 类的加载过程大致是个什么过程? 我们编写产生.java文件,这些.java文件经过Java编译器编译成拓展名为.class的文件,.class文件中保存着Java代码经转换后 ...

  8. JVM学习笔记之-类加载子系统,类的加载与类的加载过程,双亲委派机制

    一 类加载器与类加载过程 类加载子系统作用 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识. ClassLoader只负责class文件的加载,至于 ...

  9. jvm类加载过程_JVM类生命周期概述:加载时机与加载过程

    作者:菜鸟小于 https://www.cnblogs.com/Young111/p/11359700.html 一个.java文件在编译后会形成相应的一个或多个Class文件,这些Class文件中描 ...

最新文章

  1. 【并行计算-CUDA开发】从零开始学习OpenCL开发(一)架构
  2. python快速入门第3版 数据_Python 快速入门 第3版
  3. wireshark-win64-3.4.0安装_万达讲堂轴承安装后易损坏的原因,点进来,告诉你!
  4. matlab 三维高程根据图片颜色给对应点赋予颜色
  5. 平面设计师必备,剪纸风格素材
  6. python爬虫笔记_python简单爬虫笔记
  7. 【网络信息安全】网络信息安全基础
  8. USB转RJ45串口调试线(console线)
  9. android当无线鼠标代码,如何将安卓手机变身为无线鼠标
  10. 【遥感专题系列】微波遥感(一、基础入门)
  11. 一键禁用windows defender
  12. VOIP/LTE/VOLTE/VOWIFI
  13. Linux SPI 子系统(x86平台)
  14. 计算机中专综合知识,湖南省汨罗市职业中专高考(八)计算机应用专业综合知识试题讲解.doc...
  15. 基于C++的医院管理系统设计与实现
  16. IPv6邻居发现协议
  17. python 图灵 微信 菜谱_python——wxpy模块实现微信尬聊(基于图灵机器人)-Go语言中文社区...
  18. 计算 2 的 1000次方
  19. Pinpoint作为链路追踪和报警(监控spring boot服务)
  20. Python程序练习题

热门文章

  1. [mov,mp4,m4a,3gp,3g2,mj2 @ 0000025ce897db40] moov atom not found
  2. Qt事件体系概述(The Event System)
  3. Codeforces 1037E Trips
  4. 怎样判定网站是否被K?网站被K的原因与解决办法
  5. 绕过阮一峰网络日志的反广告过滤脚本
  6. oracle数据库exp/imp导出导入数据
  7. SylixOS 共用中断号机制
  8. base64解码是什么
  9. 最近做项目所积累的一些小知识(一)
  10. 联想x3300 m4服务器维修,【联想x3300 M4参数】联想x3300 M4系列服务器参数-ZOL中关村在线...