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

猜你喜欢

转载自blog.csdn.net/weixin_42849915/article/details/81324909
今日推荐