静态代码块、构造代码块、构造函数执行顺序

名词解释省略,直接进入正题

1、三者在单个类中执行顺序

代码

public class Check {

    static String str = "这是一个静态变量";

    static {
        System.out.println("这里是静态代码块。。。");
    }

    {
        System.out.println("这里是构造代码块。。。");
    }

    public Check() {
        System.out.println("这里是无参构造函数。。。");
    }

    public Check(String arg) {
        System.out.println("这里是带参构造函数。。。");
    }

    public static void main(String[] args) {

        System.out.println(Check.str);

        new Check();

        new Check("arg");
    }
}

输出结果

这里是静态代码块。。。
这是一个静态变量
这里是构造代码块。。。
这里是无参构造函数。。。
这里是构造代码块。。。
这里是带参构造函数。。。

结论

①静态代码块在类装载时会自动执行,且仅执行一次,优先于静态变量,可用于初始化静态变量。

②每次调用构造函数,均会先调用构造代码块,多个构造函数重复代码可提取到构造代码块。

2、三者在父子类中执行顺序

代码

class Father{
​
    static String f = "父类静态变量";
​
    static {
        System.out.println("父类静态代码块");
    }
​
    {
        System.out.println("父类构造代码块");
    }
​
    public Father() {
        System.out.println("父类无参构造函数");
    }
​
    public Father(String arg) {
        System.out.println("父类带参构造函数");
    }
}
​
public class Son extends Father{
    static String s = "子类静态变量";
​
    static {
        System.out.println("子类静态代码块");
    }
​
    {
        System.out.println("子类构造代码块");
    }
​
    public Son() {
        System.out.println("子类无参构造函数");
    }
​
    public Son(String arg) {
        super(arg);
        System.out.println("子类带参构造函数");
    }
​
    public static void main(String[] args) {
        System.out.println(Son.s);
​
        new Son();
​
        new Son("arg");
    }
}

输出结果

父类静态代码块
子类静态代码块
子类静态变量
父类构造代码块
父类无参构造函数
子类构造代码块
子类无参构造函数
父类构造代码块
父类带参构造函数
子类构造代码块
子类带参构造函数

结论

①静态代码块在类装载时会自动执行,且仅执行一次,优先于静态变量,可用于初始化静态变量,父类优先于子类。

②调用子类构造函数,会默认先调用父类无参构造函数。调用构造函数前,均会先调用本类构造代码块。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值