• 静态域/域的初始化、静态代码块/构造代码块的实行、构造方法的调用 顺序


    这5者的先后顺序中,有些顺序是跟Java源代码顺序有关的,有些无关的。

    首先应该定义两个类,用于代表两种域的类型,这两个类的构造方法会打印信息,用于指示自身被实例化了。

    class Field {
        public Field(int i) {
            System.out.println("B: 域引用第 " + i + " 次实例化");
        }
    }
    
    class StaticField {
        public StaticField(int i) {
            System.out.println("A: 静态域引用第 " + i + " 次实例化");
        }
    }

    1:静态的“东西”一定是比非静态的先执行的。

    public class InitOrderTest {
        public static void main(String[] args) {
            Body b = new Body();
        }
    }
    
    class Body {
        // B
        {
            System.out.println("B: 构造代码块第1次");
        }
        Field f1 = new Field(1);
        {
            System.out.println("B: 构造代码块第2次");
        }
        {
            System.out.println("B: 构造代码块第3次");
        }
        Field f2 = new Field(2);
    
        // A
        static {
            System.out.println("A: 静态代码块第1次");
        }
        static StaticField sf1 = new StaticField(1);
        static {
            System.out.println("A: 静态代码块第2次");
        }
        static {
            System.out.println("A: 静态代码块第3次");
        }
        static StaticField sf2 = new StaticField(2);
    
        // C
        public Body() {
            System.out.println("C: 构造方法");
        }
    }
    A: 静态代码块第1次
    A: 静态域引用第 1 次实例化
    A: 静态代码块第2次
    A: 静态代码块第3次
    A: 静态域引用第 2 次实例化
    B: 构造代码块第1次
    B: 域引用第 1 次实例化
    B: 构造代码块第2次
    B: 构造代码块第3次
    B: 域引用第 2 次实例化
    C: 构造方法

    即便Body类的B代码片段写在A片段前面,打印结果A还是在B前面,因为类需要先加载才能实例化,静态域和静态代码块会在类生命周期的“初始化”步骤中进行处理。

    静态域和静态代码块算是“类"层次,域和构造代码块算是“对象”层次,同一层次的域和代码块顺序先后跟代码顺序一致,不存在一定是谁先处理的情况。

    class Body {
        // B
        {
            System.out.println("B: 构造代码块第1次");
        }
        {
            System.out.println("B: 构造代码块第2次");
        }
        Field f1 = new Field(1);
        {
            System.out.println("B: 构造代码块第3次");
        }
        Field f2 = new Field(2);
    
        // A
        static {
            System.out.println("A: 静态代码块第1次");
        }
        static {
            System.out.println("A: 静态代码块第2次");
        }
        static StaticField sf1 = new StaticField(1);
        static {
            System.out.println("A: 静态代码块第3次");
        }
        static StaticField sf2 = new StaticField(2);
    
        // C
        public Body() {
            System.out.println("C: 构造方法");
        }
    }
    A: 静态代码块第1次
    A: 静态代码块第2次
    A: 静态域引用第 1 次实例化
    A: 静态代码块第3次
    A: 静态域引用第 2 次实例化
    B: 构造代码块第1次
    B: 构造代码块第2次
    B: 域引用第 1 次实例化
    B: 构造代码块第3次
    B: 域引用第 2 次实例化
    C: 构造方法

    构造方法是这5者中最后执行的

    class Body {
        // C
        public Body() {
            System.out.println("C: 构造方法");
        }
    
        // B
        {
            System.out.println("B: 构造代码块第1次");
        }
        Field f1 = new Field(1);
        {
            System.out.println("B: 构造代码块第2次");
        }
        {
            System.out.println("B: 构造代码块第3次");
        }
        Field f2 = new Field(2);
    
        // A
        static {
            System.out.println("A: 静态代码块第1次");
        }
        static StaticField sf1 = new StaticField(1);
        static {
            System.out.println("A: 静态代码块第2次");
        }
        static {
            System.out.println("A: 静态代码块第3次");
        }
        static StaticField sf2 = new StaticField(2);
    }
    A: 静态代码块第1次
    A: 静态域引用第 1 次实例化
    A: 静态代码块第2次
    A: 静态代码块第3次
    A: 静态域引用第 2 次实例化
    B: 构造代码块第1次
    B: 域引用第 1 次实例化
    B: 构造代码块第2次
    B: 构造代码块第3次
    B: 域引用第 2 次实例化
    C: 构造方法
  • 相关阅读:
    springboot嵌入式servlet容器的自动配置以及原理
    简单认识springboot的错误处理机制
    使用springboot来编写web项目的一些实现
    spring-cloud-starter-openfeign 源码详细讲解
    简述application.properties和application.yml 以及 @ConfigurationProperties 和@PropertySource @Value 和@ImportResource的用法,区别
    Ribbon源码分析(二)-- 服务列表的获取和负载均衡算法分析
    git的详细使用,项目创建到同步远程仓库,版本回退,忽略文件,分支创建,分支合并,分支名称修改,冲突解决,项目迁移
    Ribbon源码分析(一)-- RestTemplate 以及自定义负载均衡算法
    eureka源码--服务的注册、服务续约、服务发现、服务下线、服务剔除、定时任务以及自定义注册中心的思路
    eureka集群的搭建
  • 原文地址:https://www.cnblogs.com/deolin/p/7085903.html
Copyright © 2020-2023  润新知