简单讲讲类的加载机制

2021-05-22  本文已影响0人  探索的影子

简单讲讲类的加载机制

理论

首先得说类的加载机制。从java文件从到内存里面经历了几个过程。

  1. 加载

    Java文件首先编译成class文件(字节码文件),通过io的方式读入文件。这个加载过程需要程序第一次使用的时候才会加载。如main方法,new对象等等。并且同时会生成一个Java.lang.Class的对象,作为方法区这个类的各种数据访问入口。

  2. 验证

    检验字节码文件是否合法。

  3. 准备

    给静态变量设置默认值,静态常量直接进行赋值。

  4. 解析

    将符号引用改为直接引用。如静态方法main会直接替换成内存所在的指针或者句柄等。这就是静态链接。动态链接是在程序的运行过程中将符号引用才替换成直接引用。

  5. 初始化

    根据程序员通过程序制定的主观计划去初始化类变量和其他资源。

    编译器收集的顺序是由语句在源文件中出现的顺序决定的,静态语句块中只能访问到定义在静态语句块之前的变量,而定义在它之后的变量,在前面的静态语句块可以赋值,但不能访问。

    private static String a = "默认值";
    
    static {
        a="新字符串";
        System.out.println(a);
    }
    

    这个打印是可以使用的。

    但是如下这部分代码就会发现编译器会提示error向前调用。Illegal forward reference

static {
        a="新字符串";
        System.out.println(a);
    }

private static String a = "默认值";
image-20210522105528552

初始化方法执行的顺序,虚拟机会保证在子类的初始化方法执行之前,父类的初始化方法已经执行完毕,因此在虚拟机中第一个被执行的类初始化方法一定是java.lang.Object。

图例
image-20210522115324605
上一篇下一篇

猜你喜欢

热点阅读