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

jvm通过IO流(本地文件或网络文件)读入字节码,当遇到某些触发条件被加载时,会在内存中生成一个代表该类的class对象,作为这个这个类的各种数据的访问入口。
在初始化之前做的一次预备初始化,这里的准备阶段是指对我们写的代码中的成员变量进行零值处理,如果定义了 int a =10,则会先初始化为 int a=0,常见零值处理规则如下
问题:为什么局部变量必须有初始值?
将符号引用替换为直接引用,该阶段会把一些静态方法(符号引用,比如 main()方法替换为指向数据所存内存的指针或句柄等(直接引用),这是所谓的静态链接过 程(类加载期间完成),动态链接是在程序运行期间完成的将符号引用替换为直接引用。
这个阶段才是真正的去执行我们自己的代码:int a =10,这回才会真的赋值为10 ,这个阶段会执行静态代码块或对静态变量进行赋值。
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();
}
}