zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    spring
    redis
    CentOS 6 安装教程(转载)
    Ajax&JSON
    课时2:RequestMapping映射及个属性
    课时1:SpringMVC环境搭建及第一个程序
    课时2:Spring整合MyBatis的几种方式 前面一个课时已经讲了一种思路了
    课时1:Spring整合MyBatis思路
    课时14:Bean的生命周期,通过import引入分散的spring文件
    课时13:作用域
  • 原文地址:https://www.cnblogs.com/fkxuexi/p/9574985.html
Copyright © 2011-2022 走看看