1.准备阶段 主要是给static 修饰的变量初始化并且分配内存 此时的初始化只是赋予烯烃默认值,除非是用final static修饰的 ,在准备阶段就已经初始化成功了。
2.初始化阶段 开始按我们写的代码来初始化 首先类初始化 静态代码块(static变量 static{}) 最后会把他们合并在一个static{}里面
然后运行类的main方法到此类初始化完成 然后开始实例化初始化 按照代码出现的顺序 最后归并在类的构造函数里面 A{}
在这里先初始化变量 然后是构造代码块 最后是构造函数。类似初始化只会有一次 是典型的单例,而实例初始化 只要创建了对象,就会重新初始化一次变量 然后是构造代码块 最后是构造函数。
总结如下:
执行顺序:(优先级从高到低)静态代码块>mian方法>构造代码块>构造方法。
其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。
普通代码块 是在方法中或语句中定义的 跟普通的代码没有区别 按代码先后顺序执行。
构造代码块 是在类里面直接定义的 先于构造函数执行
构造代码块:直接在类中定义且没有static修饰没有名字的{}代码块称为构造代码块。
构造代码块在每次创建对象时都会被调用,并且构造代码块的执行次序优先于类构造函数。
public class TestJava { final static int a = 10; // public static int i = 1; static { System.out.println("static block");//不能引用,不合法 } final int n = 0; // public static int h =9; public static int m = print("m static block"); public int k =12; public int j =44; { print("constrcotor1 block"); } public TestJava() { System.out.println("constrcotor TestJava"); } { print("constrcotor2 block"); } public static void main(String[] args) { System.out.println("main"); // System.out.println(i); // System.out.println(m); TestJava testJava = new TestJava(); new TestJava(); { System.out.println("main block"); } } public static int print(String str) { System.out.println(str); return 1; } } 输出结果
static block
m static block
main
constrcotor1 block
constrcotor2 block
constrcotor TestJava
constrcotor1 block
constrcotor2 block
constrcotor TestJava
main block