首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >JVM 类加载过程详解 及初始化顺序代码验证 彻底搞定面试官

JVM 类加载过程详解 及初始化顺序代码验证 彻底搞定面试官

作者头像
AI码师
发布2022-12-22 10:23:51
发布2022-12-22 10:23:51
3690
举报

B站搜索“乐哥聊编程“有本篇文章配套视频‍ https://www.bilibili.com/video/BV1NW4y1x7VN

加载

jvm通过IO流(本地文件或网络文件)读入字节码,当遇到某些触发条件被加载时,会在内存中生成一个代表该类的class对象,作为这个这个类的各种数据的访问入口。

触发加载的条件

  • 遇到new、getstatic、putstatic、invokestatic这四条指令时,如果类没有被初始化,则首先对类进行初始化
  • 使用java.lang.reflect包的方法对类进行反射调用时,若类没有进行初始化,则触发其初始化。
  • 当初始化一个类时假如该类的父类没有进行初始化,首先触发其父类的初始化。
  • 运行JVM必须指定一个含有main方法的主类,虚拟机会先初始化这个类。

验证

  • 文件格式验证
  • 元数据验证
  • 字节码验证
  • 符号引用验证

准备

在初始化之前做的一次预备初始化,这里的准备阶段是指对我们写的代码中的成员变量进行零值处理,如果定义了 int a =10,则会先初始化为 int a=0,常见零值处理规则如下

  • int 0
  • long 0L
  • short 0
  • char '\u0000'
  • byte 0
  • boolean false
  • float 0.0f
  • double 0.0d
  • 引用类型 null

问题:为什么局部变量必须有初始值?

解析

将符号引用替换为直接引用,该阶段会把一些静态方法(符号引用,比如 main()方法替换为指向数据所存内存的指针或句柄等(直接引用),这是所谓的静态链接过 程(类加载期间完成),动态链接是在程序运行期间完成的将符号引用替换为直接引用。

初始化

这个阶段才是真正的去执行我们自己的代码:int a =10,这回才会真的赋值为10 ,这个阶段会执行静态代码块或对静态变量进行赋值。

实战练习

代码语言:javascript
复制
package com.lglbc.day1;

/**
 * @Description TODO
 * @Author 乐哥聊编程
 * @Date 2022/11/13 10:52
 */
class A {
    public A() {
        System.out.println("A 构造方法");
    }
    {
        System.out.println("执行A 代码块");
    }
    static {
        System.out.println("A static");
    }
}
class B extends A {
    {
        System.out.println("执行B 代码块");
    }
    public B() {
        System.out.println("B 构造方法");
    }

    static {
        System.out.println("B static");
    }
}

public class TestJVMInit{
    public static void main(String[] args) {
        B b = new B();
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乐哥聊编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 加载
    • 触发加载的条件
  • 验证
  • 准备
  • 解析
  • 初始化
  • 实战练习
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档