init与clinit区别

clinit

方法只能被jvm调用, 专门承担类变量的初始化工作。但并非所有的类都会拥有一个方法, 满足下列条件之一的类不会拥有方法:

  • 该类既没有声明任何类变量,也没有静态初始化语句;
  • 该类声明了类变量,但没有明确使用类变量初始化语句或静态初始化语句初始化;
  • 该类仅包含静态 final 变量的类变量初始化语句,并且类变量初始化语句是编译时常量表达式;

init

方法的执行时期: 对象的初始化阶段。
实例化一个类的四种途径:

  • 调用 new 操作符
  • 调用 Class 或 java.lang.reflect.Constructor 对象的newInstance()方法
  • 调用任何现有对象的clone()方法
  • 通过 java.io.ObjectInputStream 类的 getObject() 方法反序列化

参考资料

jvm基础第三节: 方法