面试【JAVA基础】类加载机制


一、类加载过程

1.一、加载

查找和导入class文件。java

1.二、连接
  • 验证
    检验载入的class文件的正确性,完整性。
  • 准备
    给类的静态变量分配存储空间,会赋对象类型的默认值。
  • 解析
    将class常量池中的符号引用转换成直接引用。api

    符号引用和直接引用的区别:数组

    • 符号引用:java编译阶段不知道所引用的对象的实际地址,使用符号引用来代替
    • 直接引用:可以直接定位到对象的指针,或相对偏移量。能定位到一个对象的内存实际地址。
1.三、初始化

对类的静态变量,代码块执行初始化操做,静态变量赋值顺序根据代码定义的顺序执行。安全

二、类的加载顺序

  1. 父类静态成员变量
  2. 父类静态代码块
  3. 子类静态成员变量
  4. 子类静态代码块
  5. 父类非静态成员变量
  6. 父类非静态代码块
  7. 父类构造方法
  8. 子类非静态成员变量
  9. 子类非静态代码块
  10. 子类构造方法

三、类加载时机

  1. 建立类实例-使用new关键字,反射,克隆,反序列化。
  2. 调用类的静态变量或者静态方法,或对静态变量进行赋值操做。
  3. 初始化子类时会先初始化父类。
  4. 虚拟机启时,包含main方法的启动类。

注意:spa

  1. 经过数组定义的引用类,不会形成类的初始化。
  2. 访问类的静态常量是不会形成类加载的。由于在编译时期,静态常量已经放入类的常量池中了。访问类静态常量实际上是直接访问常量池中的常量,不须要加载类。

四、静态常量是何时赋值的

静态常量在编译阶段把初始值存入class文件的常量池中,在类的准备阶段,将值赋给静态变量。3d

五、什么是双亲委派

1.类加载器包括:BootstrapClassLoader、ExtensionClassLoader、 ApplicationClassLoader、自定义的类加载器。
2.双亲委派模型:若是一个类加载器收到了加载类的请求,首先交给父类加载器进行加载,若是父类加载器加载失败,当前类才会本身加载类。
3.双亲委派的做用:避免重复加载,父类已经加载子类不用加载,防止用户自定义加载器加载java核心的api,带来安全隐患。
4.一个类是否被加载是经过全类名和命名空间肯定的,命名空间是加载类的加载器名。指针

六、如何自定义类加载器

继承classloader类,重写findClass方法。对象

tencent.jpg

相关文章
相关标签/搜索