类的加载与实例化

类的加载与实例化

类加载
概念:类加载过程实质是读取.class文件生成对应的java.long.Class对象,并将类的静态数据结构初始化的过程。
注:class对象封装了类在方发区中的数据结构,并提供了访问方发区数据结构的接口。此时非静态成员变量、普通方法、普通代码块还未加载不能访问,这些要等到对象实例化的时候再加载,在堆中开辟内存空间而不是方法区。
加载的策略:可以预先加载,不一定等到使用类的时候,类加载不报错,报错要等到使用的时候才知道。
类的生命周期:加载->连接(验证->准备->解析)->初始化->使用->卸载
类的生命周期,(实例化没有明显的属于加载还是使用阶段)
类的加载包含 加载、连接、初始化
注:类的加载过程是按顺序开始的但不是按顺序进行的【解析阶段在某些情况下可以在初始化之后开始,称之为动态绑定】

  1. 加载阶段:查找并加载类的.class文件,文件的二进制字节流按照虚拟机所需的格式存储在方法区之中,而且在Java堆中也创建一个java.lang.Class类的对象,通过该对象访问方法区中的这些数据。
    由类加载器完成
  2. 连接
    验证:确保被加载类的正确性
    准备:为静态变量分配内存,并初始化为默认值(如0、0L、null、false等),如变量为静态常量 static final 修饰,则直接初始化为设置的值【.class文件中的符号引用、常量的值存放在方法区的常量池中】
    解析:将符号引用替换为直接引用(String s=“123”;再class文件中表现为符号引用用,在jvm加载类进行使用时要将符号引用转换为直接含义即String s=“123”;)
    【以上称之为类的半初始化过程】
  3. 初始化
    1.1 给类变量赋予代码中设置的值【包好静态代码块执行,匿名代码快执行,调用构造器方法】
    初始化类变量的方式:
    a、声明变量指定初始值
    b、使用静态代码块赋值
    初始化的触发条件:对类的主动引用
    1、new类的实例
    2、访问类或接口的静态变量,设置静态变量的值
    3、调用类的静态方法
    4、反射(Class.forName())
    5、初始化子类,父类初始化
    6、jvm启动时被标明为启动类的类,java.exe调用程序运行的主类
    【被动引用如:使用子类引用父类的静态变量,final static 修改的变量在编译是已经初始了值,使用类访问该静态常量不会触发类加载】
  4. 实例化
    1、在堆中开辟内存空间,设置实例变量默认值,设置新对象头信息
    2、执行实例变量的初始化(设置普通变量,运行非静态代码块及方法)
    3、运行构造函数,把对象首地址赋值给应用变量

初始化与实例化小结
二者对比
图片来源:https://www.cnblogs.com/pu20065226/p/12206463.html
参考:
https://www.cnblogs.com/pu20065226/p/12206463.html
https://www.cnblogs.com/ityouknow/p/5603287.html
https://www.cnblogs.com/baby-zhude/p/8046457.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值