JAVA 类加载机制及初始化过程

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

猜你喜欢

转载自blog.csdn.net/xuyao625010693/article/details/81740506