子父类构造代码块/静态代码块/普通代码块执行顺序....(涉及父类静态中再次创建子类对象的特殊情况)

//代码可直接复制eclipse运行检验结果
class A{
static int a =10;
static{
System.out.println(a);
System.out.println(“A的静态代码块!”);
B b = new B();
System.out.println(b.a);
}
{

    System.out.println("A 的构造代码块!");
}
public A(){
    System.out.println("A 的构造方法");
}

}
class B extends A {
static int a = 20;
static {

    System.out.println("B的静态代码块");
    a= 30;
    System.out.println(a);

}
{
    System.out.println("B的构造代码块!");
}
public B(){
    System.out.println("B的构造方法!");
}

}
public class Test00 {
public static void main(String[] args) {
B b =new B();
}
}
/*main方法中创建B的对象作为开始:
1.—类B,发现有A父类,找到A;
2.按着流程走:1)A,B类中所有静态成员创建空间,并默认初始化,
即A类的a,B类的a此时都是0
2)执行A类的静态代码块,首先是a静态成员变量被赋值
—————-输出a即 10;
—————-输出 A的静态代码块!
3)创建B对象!!!同样找到B并找到父类A,可是发现
二者静态成员都已创建过空间,感觉这里虚拟机会被欺骗
直接跳过静态过程,来到了A普通代码块,构造代码块
–依次输出 A 的构造代码块!A 的构造方法
–再跳到B中普通代码块,构造代码块,输出
B的构造代码块!
B的构造方法!
3.注意这个时候才返回我们第一次静态成员过程中(即2.3过程第一步)
new B 那个步骤,继续往下走!!!!
要打印b.a,此时b空间里的a并没有任何显示初始化,是0,所以输出0;
4.然后继续到B的静态代码块中,输出
B的静态代码块
30
5.再重复2.3剩下的过程,即正常—父类普通代码块–父类构造代码块–
子类普通代码块–子类构造代码块
输出:
A 的构造代码块!
A 的构造方法
B的构造代码块!
B的构造方法!

结束.
正常的过程是:
初始化过程:
1.父类静态;
2.子类静态;
3.父类普通–>父类构造方法结束
4.子类普通–>子类构造方法结束
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值