文章目录
- 知识点(一):初始化阶段就是执行类构造器方法(即`<clinit>()`)的过程
- 知识点(二):`<clinit>()`方法不需定义,它是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来的
- 知识点(三):构造器方法中的指令是按照语句在源文件中出现的顺序来执行的
- 知识点(四):类构造器方法(即`<clinit>()`)不同于类的构造器,从虚拟机的视角下看,类的构造器就是`<init>()`
- 知识点(五):若该类具有父类,则JVM会保证在子类的`<clinit>()`执行之前,父类的`<clinit>()`已经执行完毕了
- 知识点(六):虚拟机必须保证一个类的`<clinit>()`方法在多线程下被同步加锁
介绍完类的加载过程的第二个阶段(即链接阶段)以后,我们再来看一下类的加载过程的第三个阶段,即Inilization阶段,翻译过来便是初始化阶段。
接下来,我就要来给大家讲讲在初始化阶段大家都需要知道些什么内容了。
知识点(一):初始化阶段就是执行类构造器方法(即<clinit>()
)的过程
首先,大家需要知道的一点是初始化阶段就是执行类构造器方法(即<clinit>()
)的过程。
这里初次提到了一个类构造器方法(即<clinit>()
),关于它,大家之前可能没有听说过,没听说过也没关系啊,大家只要知道它不等同于类的构造器就行,它俩不是一回事,注意,类的构造器就是虚拟机视角下的<init>()
。
知识点(二):<clinit>()
方法不需定义,它是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来的
然后,大家需要知道的一点就是此方法不需定义,它是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来的。
也就是说,<clinit>()
方法已经被提前定义好了,根本就不需要我们来定义,你有见过我们在使用Java类的时候,定义过这样的方法吗?没有吧!是不是?
知道类构造器