静态/非静态代码块和变量,构造器执行顺序(结合类加载过程)

本文详细解析Java类的生命周期,涵盖加载、验证、准备、解析、初始化和使用阶段,重点讲解clinit()与init()方法的执行顺序及静态变量初始化。通过实例剖析类的创建和执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要起记录作用

借鉴链接
类生命周期
类的字节码从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中准备、验证、解析3个部分统称为连接(Linking)。类的生命周期如下图所示:
在这里插入图片描述

其中,加载、验证、准备、初始化、卸载在类的生命周期的顺序是不变的,那解析呢,它在某些情况下可能在初始化之后开始。这里要强调“开始”这两个字,因为类的生命周期里都是交叉完成的,通常会在执行一个阶段的过程中开始另外一个阶段。

在链接-准备过程中 主要对静态变量赋初值 final修饰变量直接赋最终值
在初始化阶段 会顺序执行clinit() init()方法
在此对两个方法简单阐述:
clinit()方法:执行 静态变量赋值和静态代码块内操作
init()方法 :顺序执行
①成员变量初始化和代码块内操作
②构造器的执行
案例:

public class StaticTest

{
public static void main(String[] args)

{
    
    staticFunction();

}

static StaticTest st = new StaticTest();

static
{
    c=3;
    System.out.println("1");
}

{
    System.out.println("2");
    System.out.println(c);
}

StaticTest()
{
    System.out.println("3");
    System.out.println("a="+a+",b="+b);
}

public static void staticFunction(){
    System.out.println("4");
}

int a=110;
static int b =112;
static int c;

}

待会儿我们给出输出结果,分析一下执行过程。

  1. 这个类是入口方法类,所以在进入Main方法之前会进行准备阶段,b和c初始化为0,然后执行初始化()方法。
  2. 执行到static StaticTest st = new StaticTest(); 会触发类的实例化。
  3. 由于初始化()方法已经在执行了,所以直接会初始化非static代码块,先执行System.out.println(“2”);打印出2。执行System.out.println©;时,由于c只进行初始化,并没有进行赋值,所以打印出0。
  4. 接着执行成员变量的初始化,a=110。
  5. 紧接着执行构造方法,执行System.out.println(“3”);,打印出3,执行System.out.println(“a=”+a+",b="+b);,a的值为110,b是类的常量,只进行了初始化,未进行赋值为0,所以打印出a=110,b=0。
  6. 静态成员变量st执行完之后,进行执行静态方法,c赋值为3,打印出1。
  7. ()执行完毕。
  8. 接着执行staticFunction方法,打印出4。
    最终的执行结果:

2
0
3
a=110,b=0
1
4

执行顺序:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值