版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
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
加深理解加深理解!!!