jvm系列之-类加载机制

1、类加载的流程

image.png

2、各个阶段所干事的事情:

2.1 加载:

1、通过类的全限定名来或者类的二进制字节流 2、将字节流的静态存储结构转换为方法区的运行时数据结构 3、在内存中生成java.lang.Class对象作为访问这个类的入口

2.2 验证:

1、主要是验证是否符合class字节码的规范

2.3 准备:

1、为类变量(静态变量)分配内存,并进行初始化(每个类型的初始值即每个类型的默认值,例如:int i=10 ,但此时的值是 0)

2、对于 final int i = 10,此时 i 的值为10

2.4 解析:

1、将符号引用转换为直接引用的过程

  • 符号引用:用一段字符串来指向一个对象的引用,
  • 直接引用:直接指向内存地址的指针
2.5 初始化:

1、为类的静态变量初始化,执行类构造器(类静态变量和静态代码块合并产生)

  • 假如这个类的直接父类还没有被初始化,则优先初始化父类
  • 假如类中还有初始化语句,那么先执行初始化语句

3、用一道面试题来结束这一章节的类容

class Parent{
    static {
        System.out.println("父类的静态代码块");
    }
    {
        System.out.println("父类的普通代码块");
    }
    public Parent(){
        System.out.println("父类的构造器");
    }
}
public class JvmLoadClassTest extends Parent{
    static {
        System.out.println("子类的静态代码块");
    }
    {
        System.out.println("子类的代码块");
    }
    public JvmLoadClassTest(){
        System.out.println("子类的构造器");
    }
    public static void main(String[] args) {
        JvmLoadClassTest test = new JvmLoadClassTest();
    }
}

为了大家可以更好的验证,我就直接把代码贴上来了,没有做成图片。

分析:

这里没有任何的变量,所以我们忽略前面的步骤,直接到初始化这一步来 1、如果还有父类没有初始化则初始化父类 2、如果还有初始化代码块,则执行初始化代码块 代码执行顺序的总结:父类静态代码块->子类静态代码块->父类普通代码块->父类构造器->子类普通代码块->子类构造函数 结果如下: image.png

转载于:https://my.oschina.net/u/2510550/blog/1927757

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值