2021-09-13

JVM学习

类实列化
为新的对象分配内存
为实例变量赋默认值
为实例变量赋正确的初始值
java编译器为它编译的每一个类都至少生成一个实例初始化方法
,在java的class文件中,这个实例初始化方法被称为""。
针对源代码中每一个类的构造方法,java编译器都会产生一个
方法

类的加载的最终产品是位于内存中的Class对象
Class对象封装了类在方法区内的数据结构,并且
向java程序员提供了访问方法区内的数据结构的接口

有两种类型的类加载器
1:java虚拟机自带的加载器
1. 根类加载器(Bootstrap)
2. 扩展类加载器(Extension)-java.lang.ClassLoader的子类
3. 系统(应用)类加载器(System)-扩展类的子类

2:用户自定义的类加载器
1. java.lang.ClassLoader的子类
2. 用户可以制定类的加载方式

类加载器并不需要等到某个类被“首次主动使用”时再被记载它。

JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,
如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载
器必须在程序首次主动使用该类时才报告错误(LinkageError)。
如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误。

类的验证:
类被加载后,就进入连接阶段。连接就是将已经读入到内存的类的
二进制数据合并到虚拟机的运行时环境中去。
类的验证的内容
1. 类文件的结构检查
2. 语义检查
3. 字节码验证
4. 二进制兼容性的验证

静态变量的两种初始化途径
1. 在静态变量的声明处进行初始化。
2. 在静态代码块中进行初始化。

类的初始化步骤
1. 假如这个类还没有被加载和连接,那就先进行加载和连接。
2. 假如类存在直接父类,并且这个父类还没有被初始化,那就先初始化直接父类
3. 假如类中在初始化语句,那就依次执行这些初始化语句。

双亲委托机制,加载器(有且仅有一个父类——根加载器除外(没父类加载器))去加载一个类时,会让其父加载器先去加载,若父加载器能够加载就父加载器加载,若不行在该加载器去加载,都不行就会报错。

验证:当一个接口在初始化时,并不要求其父接口都完成了初始化。
只有在真正使用到父接口的时候(如引用接口中所定义的常量时),才会初始化。

在这里插入图片描述
输出:
在这里插入图片描述
以上例子验证当一个接口在初始化时,并不要求其父接口都完成了初始化成功。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值