Java类初始化时机测试方法解析

2025-05-29 0 49

<clinit>()方法

Java 加载的初始化过程中,编译器按语句在源文件中出现的顺序,依次自动收集中的所有变量的赋值动作和静态代码块中的语句合并产生方法。 如果中没有静态语句和静态代码块,那可以不生成<clinit>() 方法。

并且 <clinit>() 不需要显式调用父(接口除外,接口不需要调用父接口的初始化方法,只有使用到父接口中的静态变量时才需要调用)的初始化方法 <clinit>(),虚拟机会保证在子的 <clinit>() 方法执行之前,父的 <clinit>() 方法已经执行完毕(所以java.lang.Object 总是第一个被加载)

Java类初始化时机测试方法解析

准备父和子

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25
class Father {

static int father_a = 1;

static {

System.out.println("父类静态代码块执行");

}

static class StaticInnerClass {

static {

System.out.println("静态内部类静态代码块执行");

}

}

}

class Son extends Father {

static {

System.out.println("子类静态代码块执行");

son_a = 300;

}

static int son_a = 100;

static final int M = 1;

}

Main方法:

1:父没有被引用但是会被先加载

new Son();

Java类初始化时机测试方法解析

2:反射也会产生主动引用:

Class a = Class.forName("clinit.Son");

(运行结果同1)

3:子使用父静态变量或方法不会产生的引用

System.out.println("Father.a = " + Son.father_a);

Java类初始化时机测试方法解析

4:通过创建数组不会加载(只是开辟一块空间)

Son[] sons = new Son[8];

Java类初始化时机测试方法解析

5:使用常量不会加载父和之(常量在Linking阶段就保存在常量池当中了)

System.out.println("Son.CONST = " + Son.CONST);

Java类初始化时机测试方法解析

6:引用静态内部不会加载外部(应用于单例模式)

new Father.StaticInnerClass();

Java类初始化时机测试方法解析

代码总结:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16
public static void main(String[] args) throws Exception {

// 1.父类没有被引用但是会被先加载

// new Son();

// 2.反射会产生主动引用

// Class a = Class.forName("clinit.Son");

// 3.子类使用父类静态变量或方法不会产生类的引用

// System.out.println("Father.a = " + Son.father_a);

// 4.通过类创建数组不会加载类(只是开辟一块空间)

// Son[] sons = new Son[8];

// 5.使用常量不会加载父类和之类(常量在Linking阶段就保存在常量池当中了)

// System.out.println("Son.CONST = " + Son.CONST);

// 6.引用静态内部类不会加载外部类(应用于单例模式)

// new Son.StaticInnerClass();

}

}

PS:由于是按出现的顺序执行的,为了避免不必要的麻烦,应尽量把静态变量写在静态代码块之前

?

1

2

3

4

5

6

7
public class Test {

public static void main(String[] args) {

System.out.println("a = " + cls.a);

}

}

class cls {

static int a = 10;8 static { a = 20; }9 }

Java类初始化时机测试方法解析

如果 调换顺序输出结果将是 a = 10

?

1

2

3

4
class cls {

static { a = 20; }

static int a = 10;

}

Java类初始化时机测试方法解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:https://www.cnblogs.com/whyha/p/13420219.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java类初始化时机测试方法解析 https://www.kuaiidc.com/118944.html

相关文章

发表评论
暂无评论