JVM——类的初始化【转】

一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。

一.类加载时,变量的初始化顺序:
 1.首先,给静态成员变量分配内存空间,进行默认初始化
  (整型为0,浮点型为0.0,布尔型为false,字符型为'u0000',引用型为null)
  
 2.其次,执行静态成员变量的初始化操作
  --静态成员的初始化,包括两种: 声明时直接初始化和静态代码块
  --执行顺序为:在代码中的出现的顺序(声明的顺序)
  
 注意: 1和2的动作,在类加载时只执行一次!!!!!!!

 如果创建了对象,则在堆中给类的实例分配内存空间,
 3.首先,对实例变量,进行默认初始化
  (整型为0,浮点型为0.0,布尔型为false,字符型为'u0000',引用型为null)
  
 4.其次,执行实例变量的初始化操作
  --实例变量的初始化,使用前2种初始化方式: 声明时直接初始化和代码块
  --执行顺序为:在代码中的出现的顺序(声明的顺序)
 
 5.最后,执行构造函数(实例变量的第3中初始化方式)
 
二.继承时,变量的初始化顺序:
 1.当类第一次使用时,JVM就会加载该类,如果该类存在父类,那么就先加载父类,这是一个递归过程,直到Object为止.
 在类加载中,首先进行静态成员变量按照默认值进行初始化,
 然后按照在类中声明的顺序执行静态代码块和静态变量的显示初始化.
 这个过程从父类到子类,并且只会执行一次!!!
 
 2.当父类与子类的静态代码初始化完成后,如果创建了类的对象,
 在初始化子类前,会先对其父类的实例变量进行默认初始化,
 然后按照在类中的声明顺序来执行代码块与实例变量的显示初始化,
 最后调用父类的构造函数,这也是一个递归过程,直到Object类为止.
 (这个过程在每次创建对象时,都会执行!!!)

原文地址:https://www.cnblogs.com/wy20110919/p/8087967.html