• 静态代码块、非静态代码块、构造函数之间的执行顺序


    1.执行顺序

    静态代码块>非静态代码块>构造函数

    public class staticCode {
        public staticCode() {
            System.err.println("构造函数");
        }
        {
            System.err.println("非静态代码块");
        }
        static{
            System.err.println("静态代码块");
        }
        public static void main(String[] args) {
            new staticCode();
        }
    
    }

    无论如何调换顺序输出的结果都是:

    静态代码块
    非静态代码块
    构造函数

    可见:静态代码块属于类,在类加载的时候就执行了,只执行一次。然后就是非静态代码块和构造函数,非静态代码块是比构造函数执行早的。

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

    如果在main方法里面创建对象两次结果为:

    静态代码块
    非静态代码块
    构造函数
    非静态代码块
    构造函数

    2.讨论有继承的情况

    class staticCode {
        public staticCode() {
            System.err.println("父构造函数");
        }
        {
            System.err.println("父非静态代码块");
        }
        static{
            System.err.println("父静态代码块");
        }
        
    
    }
     public class staticCode_1 extends staticCode{
        public staticCode_1() {
            System.err.println("子构造函数");
        }
        {
            System.err.println("子非静态代码块");
        }
        static{
            System.err.println("子静态代码块");
        }
        public static void main(String[] args) {
            new staticCode_1();
        }
    }

    结果为:

    父静态代码块
    子静态代码块
    父非静态代码块
    父构造函数
    子非静态代码块
    子构造函数

    结论:静态代码块属于类,在子类加载的先加载父类,所以父静态代码块最优先,其次就是子静态代码块,它们都只执行一次。

            然后就开始构造父类,但是要先执行非静态代码块。

            最后才构造子类,同样先执行非静态代码块。

  • 相关阅读:
    selenium环境搭建
    noip2020游记
    [HNOI2007]分裂游戏——博弈论好题
    [SCOI2007]压缩——区间dp
    赛道修建——二分答案
    玩诈欺的小杉——异或优化的状压dp
    【佛山市选2013】排列——发现性质与转化问题
    电话线铺设——难实现的最小生成树
    备用钥匙——分情况讨论的好dp
    喝喝喝——稍加推导的好转化
  • 原文地址:https://www.cnblogs.com/lq625424841/p/7090483.html
Copyright © 2020-2023  润新知