Java初始化过程

Java初始化

总结:初始化顺序:父类静态变量——> 父类静态代码块 ——>子类静态变量 ——> 子类静态代码块 ——>父类非静态变量 ——>父类构造代码块——> 父类构造函数 ——>字类非静态变量 ——>子类构造代码块——> 子类构造函数

静态代码块只会被执行一次!!!!

1. 关键:Java一个类的成员变量初始化先于构造函数执行。详细请参考:

参考博客:传送门

2. 该代码为何输出:YXYZ

class X{
    Y y=new Y();
    public X(){
        System.out.print("X");
    }
}
class Y{
    public Y(){
        System.out.print("Y");
    }
}
public class Z extends X{
    Y y=new Y();
    public Z(){
        System.out.print("Z");
    }
    public static void main(String[] args) {
        new Z();
    }
}

3.原因

执行顺序如下列注释序号所示

//下面代码输出YXYZ的原因,和Java调用机制有关
class X{

    //5.初始化动作总是先于构造函数执行,所以先执行类的初始化动作
    //6.此处会调用类Y的构造函数
    Y y=new Y();
    public X(){
        //3.此处隐藏了super()语句,所以调用直接父类Object的构造函数
        //4.Object没有父类,所以程序返回到此处.
        //10.本类初始化完成,执行权回到此处,打印输出X,程序返回
        System.out.print("X");
    }
}
class Y{
    public Y(){
        //7.此处隐藏了super()语句,所以调用直接父类Object的构造函数
        //8.Object没有父类,所以程序返回到此处.
        //9.没有成员变量需要初始化,所以继续执行下面代码,打印输出Y,程序返回

        //13.此处隐藏了super()语句,所以调用直接父类Object的构造函数
        //14.Object没有父类,所以程序返回到此处.
        //15.没有成员变量需要初始化,所以继续执行下面代码,打印输出Y,程序返回
        System.out.print("Y");
    }
}
public class Z extends X{
    //12.程序来到此处执行初始化动作,此处会调用类Y的构造函数
    Y y=new Y();
    public Z(){
        //2.此处隐藏了super()语句,所以调用直接父类X的构造函数
        //11.执行权回到此处,但本类成员变量尚未初始化,先初始化
        //16.本类初始化完成,执行权回到此处,打印输出Z,程序返回
        System.out.print("Z");
    }
    public static void main(String[] args) {
        //1.调用类Z的构造函数
        new Z();
        //17.程序执行到此处,结束。
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值