JAVA类加载、和初始化

深入解析Java类加载过程与初始化细节

JAVA类加载过程“
加载-》连接(验证、准备、解析)-》初始化
JAVA 类加载:
(1) 通过全类名获取定义此类的二进制字节流(jar、war、ear)
(2) 将字节流所代表的的静态存储结构,转换为方法区的运行时数据结构
(3) 在内存中生成一个代表该类的Class对象,作为方法区这些数据访问入口
JAVA 类连接
(1) 验证:文件格式验证、元数据验证、字节码验证、符号引用验证
(2) 准备:正式为类变量(static属性)分配内存;除final修饰的变量外,其他的都赋值为初始值(0、null、false)
(3) 解析:将常量池中的符号引用替换为直接引用。(即将符号变为内存地址)
JAVA 类初始化:
(1) 初始化调用的是()方法,该方法是带锁线程安全,所以在多线程环境进行类初始化可能会引起死锁
(2) 有5种情况下,必须对类进行初始化(……)

JAVA类的初始化顺序:
静态属性:static定义的属性
静态方法块:static{}内的方法块
普通属性:无static定义的属性
普通方法块:{}内的方法块
构造函数:
为什么构造函数最后执行?
如果先执行,可能赋值会被后续的方法或变量修改
父类和子类的初始化顺序:
父类静态属性、父类静态代码块
子类静态属性、子类静态代码块
父类普通属性、普通代码块、构造函数
子类普通属性、普通代码块、构造函数
JAVA 双亲委派模型
类加载时,优先去父类加载器中寻找是否有对应的类

一些考过的知识点:
(1)new某个类的数组时,不会触发类的初始化
(2)引用某个类的final修饰的且是基本类型的属性,不会触发类的初始化(final属性在加载阶段就分配并赋值了),但是如果是final修饰的引用类型的属性,则会触发初始化。
(3)子类引用父类的static属性,会初始化父类,不会初始化子类。

JAVA Stream的中间操作:

JAVA Stream的终止操作:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值