JavaGuide icon indicating copy to clipboard operation
JavaGuide copied to clipboard

类加载的初始化阶段的clinit方法应该不是构造方法

Open ghost opened this issue 5 years ago • 2 comments

Uploading image.png…

ghost avatar Sep 22 '20 07:09 ghost

这里图片无法显示出来了,建议小伙伴可以提交一个pr

Snailclimb avatar Oct 07 '20 09:10 Snailclimb

@Snailclimb 我总结的对于 \docs\java\jvm[加餐]大白话带你认识JVM.md 下面一句话的补充和修改,请参考讨论:

2.1.3 初始化 ##初始化其实就是一个赋值的操作,它会执行一个类构造器的<clinit>()方法。由编译器自动收集类中所有变量的赋值动作,此时准备阶段时的那个 static int a = 3 的例子,在这个时候就正式赋值为3

字节码文件中初始化方法有两种,非静态资源初始化的<init>和静态资源初始化的<clinit>,类加载过程的初始化阶段就是执行类构造器<clinit>方法,顺序完成父类子类静态成员变量(类变量)显示初始化和父类子类静态代码块语句。 (注意:静态代码块中可能会对类变量再次赋值而覆盖显示初始化)

代码及字节码说明:

Snipaste_2020-12-17_17-53-03 Snipaste_2020-12-17_17-57-29 Snipaste_2020-12-17_17-57-57 Snipaste_2020-12-17_17-58-27

请参考: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.9 https://blog.csdn.net/u013309870/article/details/72975536

iloooo avatar Dec 17 '20 10:12 iloooo