对象的创建过程和ClassLoader类加载机制

319 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

当在main方法中创建对象时,JVM会先去方法区下找有没有所创建对象的类存在,有就可以创建对象了,没有则把该类加载到方法区在创建类的对象时,首先会先去堆内存中开辟一块空间,开辟完后分配该空间(指定地址)当空间分配完后,加载对象中所有的非静态成员变量到该空间下所有的非静态成员变量加载完成之后,对所有的非静态成员进行默认初始化所有的非静态成员默认初始化完成之后,调用相应的构造方法到栈中在栈中执行构造函数时,先执行隐式,再执行构造方法中书写的代码构造方法中的隐式:

第一步:执行super()语句调用父类的没有参数的构造方法

第二步:对所有的非静态成员变量进行显式初始化(在定义成员变量时后面有赋值)

第三步:所有的非静态成员变量显式初始化完成之后,执行构造代码块

Ps.第二步第三步按照书写顺序执行

最后执行构造方法中书写的代码

当整个构造方法全部执行完,此对象创建完成,并把堆内存中分配的空间地址赋给对象名(此时对象名就指向了该空间)

ClassLoader类加载机制
概念:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制

哪些场景会触发类加载

1.new关键字实例化对象时、读取或者设置一个类的静态字段时、以及调用一个类的静态方法的时候如果类没有进行过初始化,则需要先触发其初始化。

2.使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。

3.当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要触发父类的初始化。

4.当虚拟机启动时,用户需要指定一个执行的主类(包含main()方法的类),虚拟机会先初始化这个类

整个生命周期包括:

加载、验证、准备、解析、初始化、使用和卸载七个阶段。

类加载器分类(必会)

Bootstrap ClassLoader

Extension ClassLoader

Application ClassLoader

双亲委派模型

如果一个类加载器接收到了类加载的请求,它首先把这个请求委托给他的父类加载器去完成,每个层次的类加载器都是如此,因此所有的加载请求都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它在搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。

好处:java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如类java.lang.Object,它存放在rt.jar中,无论哪个类加载器要加载这个类,最终都会委派给启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都是同一个类会出现不同版本