一、什么时候加载和初始化

1、类什么时候加载

类的加载是通过类加载器(Classloader)完成的,它既可以是饿汉式[eagerly load](只要有其它类引用了它就加载)加载类,也可以是懒加载[lazy load](等到类初始化发生的时候才加载)。不过我相信这跟不同的JVM实现有关,然而他又是受JLS保证的(当有静态初始化需求的时候才被加载)

2、类什么时候初始化

加载完类后,类的初始化就会发生,意味着它会初始化所有类静态成员,以下情况一个类被初始化:

  1. 实例通过使用new()关键字创建或者使用class.forName()反射,但它有可能导致ClassNotFoundException。
  2. 类的静态方法被调用
  3. 类的静态域被赋值
  4. 静态域被访问,而且它不是常量
  5. 在顶层类中执行assert语句

二、加载和实例化对象

类加载过程:

1, JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区

2, 在.class加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态内容

3, 加载非静态内容:把.class中的所有非静态内容加载到方法区下的非静态区域内

4, 加载静态内容:

4.1、把.class中的所有静态内容加载到方法区下的静态区域内

4.2、静态内容加载完成之后,对所有的静态变量进行默认初始化

4.3、所有的静态变量默认初始化完成之后,再进行显式初始化

4.4、当静态区域下的所有静态变量显式初始化完后,执行静态代码块

5,当静态区域下的静态代码块,执行完之后,整个类的加载就完成了。

6,如果存在继承关系,则父类先加载,再加载子类。

对象创建过程:

1, 在堆内存中开辟一块空间

2, 给开辟空间分配一个地址

3, 把对象的所有非静态成员加载到所开辟的空间下

4, 所有的非静态成员加载完成之后,对所有非静态成员变量进行默认初始化

5, 所有非静态成员变量默认初始化完成之后,调用构造函数

6, 在构造函数入栈执行时,分为两部分:先执行构造函数中的隐式三步,再执行构造函数中书写的代码

6.1、隐式三步:

1,执行super语句

2,对开辟空间下的所有非静态成员变量进行显式初始化

3,执行构造代码块

6.2、在隐式三步执行完之后,执行构造函数中书写的代码

7,在整个构造函数执行完并弹栈后,把空间分配的地址赋值给一个引用对象

总结类中能书写的成员

栈: 用来运行函数。可以存储局部信息

特点:先进后出

堆:用来存储实体(被new创建出来的)。

特点:

1,  每一个实体所开辟的空间都有一个地址

2,  每一个实体中存储的数据都有一个默认初始值

方法区:存放class和static。 方法区其实是由N多个小的区域构成。有存放非静态内容的非静态区域,还有存放静态内容的静态区域,还有存放常量的常量池 等

总结

1、加载过程:

先加载非静态区域(未实例化),再加载静态区域默认初始化、显示初始化,然后执行静态代码块。父类先加载。(这个过程看不到摸不着,感觉不到,平时也不需要理会这方面的问题,所以不多说)

2、对象创建过程:

对所有非静态成员变量进行默认初始化,调用构造函数,而构造函数分三步走,1、执行super语句,2、对所有非静态成员变量进行显式初始化,3、执行构造代码块。

所以在执行构造函数的代码块之前所有成员变量都已经经过显示初始化。在整个构造函数执行完并弹栈后,把空间分配的地址赋值给一个引用对象。

可见过程:

一、无继承关系

1、初始化静态成员变量。2、执行静态代码块。3、初始化非静态成员变量。4调用构造函数。5、把空间分配的地址赋值给一个引用对象。

二、存在继承关系

1、初始化父类静态成员变量。2、执行父类静态代码块。3、初始化子类静态成员变量。4、执行子类静态代码块。5、初始化父类非静态成员变量。6、执行父类非静态代码块。7、执行父类构造函数。8、初始化子类非静态成员变量。8、执行子类非静态代码块。9、执行子类构造函数。10、把空间分配的地址赋值给一个引用对象。

创建一个有继承关系的子类对象流程的简洁总结:先加载父类,再加载子类,实例化父类,最后实例化子类

java的各种加载和初始化的详细过程相关推荐

  1. java虚拟机规范-加载、链接与初始化

    前言 java虚拟机是java跨平台的基石,本文的描述以jdk7.0为准,其他版本可能会有一些微调.java代码本身并不能为jvm识别,实际上在jvm中的表现形式为Class对象,一个java类从字节 ...

  2. Java深度历险(二)——Java类的加载、链接和初始化

    在上一篇文章中介绍了Java字节代码的操纵,其中提到了利用Java类加载器来加载修改过后的字节代码并在JVM上执行.本文接着上一篇的话题,讨论Java类的加载.链接和初始化.Java字节代码的表现形式 ...

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

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

  4. java 类的加载、连接和初始化

    JVM和类 调用Java命令运行Java程序时,该命令将会启动一条Java虚拟机进程,不管该Java程序启动了多少条线程,创建了多少个变量,它们都处于该Java虚拟机进程里,共享该JVM进程的内存区. ...

  5. java类的加载,链接,初始化

    Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够在JVM中被使用,需要经过加载.链接和初始 ...

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

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

  7. java 静态初始化 调用_java JVM-类加载静态初始化块调用顺序

    测试类加载的全过程 public class Have { static { System.out.println("加载Have");//先加载Have再调用main方法 } p ...

  8. java jvm 加载类的顺序_java JVM-类加载静态初始化块调用顺序

    测试类加载的全过程 public class Have { static { System.out.println("加载Have");//先加载Have再调用main方法 } p ...

  9. Java类的加载过程详解 面试高频!!!值得收藏!!!

    受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话: 八小时内谋生活,八小时外谋发展. 望别日与 ...

最新文章

  1. CesiumLab V1.2 新功能 倾斜数据处理
  2. MySQL + JSON = 王炸!!
  3. 用Python玩转词云
  4. i2c的时钟延展问题
  5. 《机器学习实战》chapter04 使用Python进行文本分类
  6. opencv4.5.0安装包_VB6.0软件安装包以及安装教程
  7. linux rmi端口,RMI 两个端口 - 差不多先生的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. 根据当月数据库自动生成下个月数据库--3
  9. spark submit参数及调优
  10. java cpu 内存使用情况_java高cpu占用和高内存占用问题排查 (转)
  11. 京东Q2营收同比增加26.2%,股价上涨超3%
  12. BZOJ4597 SHOI2016随机序列(线段树)
  13. 游戏对战平台--吃货大作战
  14. java 2 sdk下载_Java 2 SDK Standard Edition官方版
  15. typecho图片插件_Typecho弹窗相册插件HighSlide1.4.7更新
  16. 基于协同过滤算法的旅游推荐系统
  17. 详细Gitee(码云)使用方法
  18. 虚拟服务器伪静态怎么设置,虚拟主机如何设置伪静态
  19. 迅雷下载器-FDM,看2019新年大电影
  20. 硬件知识(二)无源RC二阶滤波电路

热门文章

  1. 剑指offer面试题[40]-数组中只出现一次的数字
  2. 21天Jmeter打卡Day10线程用户之setUp和tearDown
  3. sessionattribute 被spring 扫描不到_Spring 系列之 Spring 常用注解总结(肝硬化的干货)...
  4. 二级Access数据库大纲知识要点
  5. matlab 计算指北角,最优化方法MATLAB4
  6. springboot项目层次结构_Springboot项目结构Springboot项目结构
  7. html img属性text,TextField的htmlText属性中img标签的有趣现象
  8. 解决mysql地区时间错误_mysql time zone时区的错误解决
  9. MATLAB中的柱面与球面
  10. android 连接ble键盘,如何在Android上以编程方式配对和连接HID蓝牙设备(蓝牙键盘)...