<clinit>()方法简述

今天看深入理解jvm是看到一个<clinit>()方法不懂到底是什么意思网上搜索了一下得出了下面的一些结论。

 1.<clinit>()方法的定义:

      在编译生成class文件时,会自动产生两个方法,一个是类的初始化方法<clinit>, 另一个是实例的初始化方法<init>。我个人认为可以简单的理解为由编译器自动收集类中的所有变量的赋值动作和静态语句块中的语句合并产生的,编译器收集的顺序是由语气在源文件中出现的顺序决定的,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它后面的变量可以赋值但不能访问。

  2.<clinit>()方法的特点

 1)在执行子类的<clinit>()方法时会保证父类的该方法已经执行完毕。

2)<clinit>()方法如果没有静态语句块那么编译器不会为该类执行<clinit>()方法。

3)接口中无静态语句块但是有赋值操作,因此接口也会有<clinit>()方法,但是接口的<clinit>()方法只用当子类和实现类中定义的变量有使用时才会执行<clinit>()方法。

4)<clinit>()方法的线程安全。

3.<clinit>()方法的过程

   


参考:1.深入理解jvm

          2.<init>与<clinit>的区别 http://blog.csdn.net/sunmenggmail/article/details/10211395

   3..clinit和init(转载) http://www.cnblogs.com/diyunpeng/archive/2010/07/11/1775200.html

猜你喜欢

转载自blog.csdn.net/cr459464757/article/details/21237933