类初始化顺序

前言

Class类中有静态属性、代码块、非静态属性…等诸多元素时,如果不清楚各个元素的初始顺序,那么很有可能会写出一些匪夷所思的代码。正因为其如此重要,所以博主写了个例子,很容易就能知道他们的初始顺序

初始化顺序

话不多说,直接上代码:

class Display {
    public static int parentStaticField() {
        System.out.println("父类静态字段");
        return 1;
    }
    public static int parentField() {
        System.out.println("父类普通字段");
        return 1;
    }
    public static int sonStaticField() {
        System.out.println("子类静态字段");
        return 1;
    }
    public static int sonField() {
        System.out.println("子类普通字段");
        return 1;
    }
}

class Parent {
    static {
        System.out.println("父类静态代码块");
    }

    {
        System.out.println("父类普通代码块");
    }

    public static int a = Display.parentStaticField();

    public int b = Display.parentField();

    static {
        System.out.println("父类静态代码块2");
    }

    public Parent() {
        System.out.println("父类构造函数");
    }

    {
        System.out.println("父类普通代码块2");
    }
}

class Son extends Parent {
    static {
        System.out.println("子类静态代码块");
    }

    {
        System.out.println("子类普通代码块");
    }

    public static int c = Display.sonStaticField();

    public int d = Display.sonField();

    static {
        System.out.println("子类静态代码块2");
    }

    public Son() {
        System.out.println("子类构造函数");
    }

    {
        System.out.println("子类普通代码块2");
    }
}

public class ClassInitialOrder {

    public static void main(String[] args) {
        new Son();
    }
}

输出结果:

父类静态代码块
父类静态字段
父类静态代码块2
子类静态代码块
子类静态字段
子类静态代码块2
父类普通代码块
父类普通字段
父类普通代码块2
父类构造函数
子类普通代码块
子类普通字段
子类普通代码块2
子类构造函数

由此可以看出,类初始化顺序为:
父类静态代码块/静态字段(按照定义顺序)=> 子类静态代码块/静态字段(按照定义顺序)=> 父类普通代码块/普通字段(按照定义顺序)=> 父类构造方法 => 子类普通代码块/普通字段(按照定义顺序)=> 子类构造函数

总结

需要注意的几点是:

  • 静态代码块和静态字段只执行一次(不管父类还是子类)
  • 静态代码比非静态代码先执行
  • 代码块和字段执行的优先级就是定义的顺序,或者说代码编写的顺序
  • 父类构造方法比子类普通代码块先执行

注意了以上四点,类的初始化应该就不是问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值