Java的初始化块及执行过程详解

https://www.cnblogs.com/bingyimeiling/p/11529403.html

class Root {

    static {
        System.out.println("Root的静态初始化块");
    }

    {
        System.out.println("Root的普通初始化块");
    }

    public Root() {
        System.out.println("Root的无参数构造函数");
    }

    public Root(String name) {
        this();
        System.out.println("Root的带参构造函数" + name);
    }
}

class Leaf extends Root {

	static{
		System.out.println("Leaf的静态初始化块");
	}

    {
        System.out.println("Leaf的普通初始化块");
    }

    public Leaf() {
        super("abc");
        System.out.println("Leaf的无参构造函数");
    }
}

public class Testt {
    public static void main(String[] args) {
        new Leaf();
    }
}

上面这段代码运行结果:

在这里插入图片描述

在同一个类中,按照静态>非静态>构造方法的顺序

静态初始化块一定最先执行

如果一个类有继承某个类,则顺序如下

父类静态块>子类静态块>父类非静态块>父类构造方法>子类非静态块>子类构造方法

所以按照结果的思路回推,子类在实例化的时候就会首先往上找父类

因为子类继承父类之后,获取到了父类的内容(属性/字段),而这些内容在使用之前必须先初始化,所以必须先调用父类的构造函数进行内容的初始化.

如果有些人在子类的构造函数第一行就开始访问父类变量,而此时父类的对象还未创建(初始化),那么你能调到什么信息,java是以安全为主的编程语言,肯定不会让这样的事情发生

刚刚打断点看了下,发现走完静态块后就进到了子类构造方法的super()里,所以虽然是进了子类构造方法但其实没执行?还是先去执行了父类的构造方法 所以表面上看是先进了子类构造方法但实际上是进了父类构造方法,这称为父类先于子类

上面这话真的狗屁不通说的我自己都难受,但目前我的理解就是这样了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值