一 , :当程序执行时,当需要用到某个类时,Java执行引擎会先检查类是否已加载,若没有加载,则加载。在执行类的加载过程中,会先初始化静态成员变量和静态代码块,静态成员变量和静态代码块的执行顺序按照其代码顺序。
二,:在生成对象时,会先初始化成员变量,然后再执行构造器。其中要注意类的加载和类的生成对象是两个过程,只要用到某类,该类就一定会被加载;但不一定需要实例化生成对象。比较下面程序1和程序2:
程序1:
public class Test { C c = new C(); static B b1 = new B(); public Test () { } public static void main(String[] args) { // TODO Auto-generated method stub Test t ; } static class B{ public B() { System.out.println("B"); } static { System.out.println("static B"); } public static void printFun() { System.out.println("function B "); } } static class C{ public C() { System.out.println("C"); } static { System.out.println("static C"); } public static void printFun() { System.out.println("function C "); } } }
执行结果为:
static B
B
程序二:
public class Test { C c = new C(); static B b1 = new B(); public Test () { } public static void main(String[] args) { // TODO Auto-generated method stub Test t = new Test (); } static class B{ public B() { System.out.println("B"); } static { System.out.println("static B"); } public static void printFun() { System.out.println("function B "); } } static class C{ public C() { System.out.println("C"); } static { System.out.println("static C"); } public static void printFun() { System.out.println("function C "); } } }
执行结果为:
static B
B
static C
C