关于java类加载机制探索理解一

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/ppwwp/article/details/102666787
package mytest;

public class B {
    private static A a = new A();
    {
        System.out.println("4");
    }

    static {
        System.out.println("5");
    }

    public B(){
        System.out.println("6");
    }
}

package mytest;

public class A extends B{
    {
        System.out.println("1");
    }
    static {
        System.out.println("2");
    }
    public A(){
        System.out.println("3");
    }

    public static void main(String args[]){
        new A();
    }

}

执行结果

4
6
1
3
5
2
4
6
1
3

总结
1:执行A里的new A时,加载父类,静态变量由上往下执行,所以先执行B里的new A。
2:执行B里的new A时,先加载父类(构造块和构造器)->子类(构造块和构造器),也就是4613
3:然后执行父类静态块->子类静态块(与步骤1关联),也就是52
4:然后在执行A里的new A,先加载父类(构造块和构造器)->子类(构造块和构造器),也就是4613
静态块执行一次,构造代码块创建一次执行一次,就是4613524613

 private static A a = new A();

在对A进行初始化的时候 不关注static代码块,输出4613 也就是对应初始化 “单纯的 new A()”
在这里插入图片描述
下面就接着开始初始化静态块 也就是52

这样就是461352

都整完了 就要开始初始化类本身了。。

还是4613重复了一遍

这句话有点问题:
静态代码块先执行 然后 执行父类静态方法和构造器 然后再是子类静态代码 和构造器方法吗?

1:执行A里的new A时,加载父类,静态变量由上往下执行,所以先执行B里的new A。
2:执行B里的new A时,先加载父类(构造块和构造器)->子类(构造块和构造器),也就是4613
3:然后执行父类静态块->子类静态块(与步骤1关联),也就是52
4:然后在执行A里的new A,先加载父类(构造块和构造器)->子类(构造块和构造器),也就是4613
静态块执行一次,构造代码块创建一次执行一次,就是4613524613

加深理解加深理解!!!

关于java类加载机制探索理解二

猜你喜欢

转载自blog.csdn.net/ppwwp/article/details/102666787