[Java]java类的加载:初始化

10 篇文章 0 订阅
本文详细介绍了Java类加载过程中的初始化阶段,阐述了类构造器()方法的执行以及父类与子类初始化的顺序。通过代码示例展示了类初始化的执行流程,包括静态块、变量赋值和构造器的调用顺序。同时,讨论了final常量如何影响类的初始化,指出当引用final常量时,由于编译期常量池的原因,可能不会触发父类或子类的初始化。
摘要由CSDN通过智能技术生成

在jvm中,类的生命周期分为七个阶段:加载 (Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化 (Initialization)、使用(Using)和卸载(Unloading)。

这里就加载阶段中“类的初始化”阶段做说明测试,以解面试题。

类的初始化是类的加载过程的最后一个步骤。初始化阶段就是执行类构造器()方法的过程。()并不是程序员在Java代码中直接编写 的方法,它是Javac编译器的自动生成物。

,Java虚拟机会保证在子类的()方法执行前,父类的()方法已经执行 完毕。
因此,可以测试得出

父类初始化(静态块顺序执行、变量赋值操作执行)>子类初始化
即为执行顺序:
父类静态块>子类静态块>父类变量和代码块>父类构造>子类变量和代码块>子类构造

代码如下:


public class SuperClass {

    public static int A = 1;
    

    static {
        System.out.println("A赋值");
        A = 2;
    }

    static {
        System.out.println("SuperClass init!");
    }
}

public class SubClass extends SuperClass {

    public static int B = A;
    static {
        System.out.println("SubClass init,B赋值!");
        B = 3;
    }
}

执行SuperLoaderTest 类main方法

public class SuperLoaderTest {

    public static void main(String[] args) {
        System.out.println(SubClass.B);
    }
}

最后输出结果为

A赋值
SuperClass init!
SubClass init,B赋值!
3

但也有不需要执行父类初始化的情况,如果子类中存在final修饰的常量,在SubClass 中添加final修饰常量HELLOWORLD


public class SubClass extends SuperClass {

    public static int B = A;
    static {
        System.out.println("SubClass init,B赋值!");
        B= 3;
    }

    public static final String HELLOWORLD = "hello world";

}

修改并执行SuperLoaderTest 类main方法

public class SuperLoaderTest {

    public static void main(String[] args) {
        System.out.println(SubClass.HELLOWORLD);
    }

}

最后输出结果为

hello world

此时不需要初始化父类,因为也并不需要初始化子类。
因为 使用finall修饰的常量在引用时,会因为编译阶段已经进入到引用类的常量池了,不会引用到定义常量的类,不会触发常量类的初始化。
即为在案例中,SubClass类中 final修饰的常量 HELLOWORLD在编译时已经进入到了SuperLoaderTest 常量池,因此程序执行时,不会初始化SubClass类,class如下图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值