• Java对象的初始化顺序,原理版,不用死记


    看了好多对Java初始化顺序的解释,都是给出验证案例。其实我还是比较喜欢根据原理理解记忆,结合前段时间学习的JVM,给出了基于自己理解的解释,如有不对,欢迎指出。

    1.同一个类中,先执行 clinit ,再执行init

    clinit : 静态属性的初始化:初始化顺序是根据静态成员的定义从上往下初始化。

    init:构造器和非静态变量初始化:初始化顺序是 非静态成员从上往下,最后构造器

    2.存在继承关系中,先执行父类clinit,再执行子类clinit,后执行父类init 再执行子类init

    附,验证代码:

    public static void main(String[] args) {
            B b = new B();
        }
    }
    
    class C {
        {
            System.out.println("C ! static block");
        }
        private  A test = new A("C mem");
    
        static {
            System.out.println("C static block");
        }
        public static A a = new A("C static mem");
        C(){
            System.out.println("C Construct");
        }
    }
    class  B extends  C{
        {
            System.out.println("B ! static block");
        }
        private  A test = new A("B !static mem");
    
        static {
            System.out.println("B static block");
        }
        public static A a = new A("B static men");
        B(){
            System.out.println("B Construct");
        }
    }
    class A {
       A(String str){
           System.out.println(str);
       }
    }

    关于我对main方法与静态成员的执行的理解,请移步 :Java中的main方法

  • 相关阅读:
    坚持
    随笔
    C++:对象和类
    STEP7 V14 安装和激活
    c++:cout
    C 格式化字符串处理函数
    WIn:消极处理机制
    Python:requests发送json格式数据
    Python:logging日志功能的基本使用
    PLC:西门子测试
  • 原文地址:https://www.cnblogs.com/yzw-daemon/p/13273080.html
Copyright © 2020-2023  润新知