• 类加载的顺序


    public class test {                         //1.第一步,准备加载类
    
        public static void main(String[] args) {
            new test();                         //4.第四步,new一个类,但在new之前要处理匿名代码块        
        }
    
        static int num = 4;                    //2.第二步,静态变量和静态代码块的加载顺序由编写先后决定 
    
        {
            num += 3;
            System.out.println("b");           //5.第五步,按照顺序加载匿名代码块,代码块中有打印
        }
    
        int a = 5;                             //6.第六步,按照顺序加载变量
    
        { // 成员变量第三个
            System.out.println("c");           //7.第七步,按照顺序打印c
        }
    
        test() { // 类的构造函数,第四个加载
            System.out.println("d");           //8.第八步,最后加载构造函数,完成对象的建立
        }
    
        static {                              // 3.第三步,静态块,然后执行静态代码块,因为有输出,故打印a
            System.out.println("a");
        }
    
        static void run()                    // 静态方法,调用的时候才加载// 注意看,e没有加载
        {
            System.out.println("e");
        }
    }

    一般顺序:静态块(静态变量)——>成员变量——>构造方法——>静态方法 
    1、静态代码块(只加载一次) 2、构造方法(创建一个实例就加载一次)3、静态方法需要调用才会执行,所以最后结果没有e 
    这里写图片描述

    
    

    这里写图片描述

    输出结果表明,程序的执行顺序为: 
    如果类还没有被加载: 
    1、先执行父类的静态代码块和静态变量初始化,并且静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。 
    2、执行子类的静态代码块和静态变量初始化。 
    3、执行父类的实例变量初始化 
    4、执行父类的构造函数 
    5、执行子类的实例变量初始化 
    6、执行子类的构造函数 

    如果类已经被加载: 
    则静态代码块和静态变量就不用重复执行,再创建类对象时,只执行与实例相关的变量初始化和构造方法。

     
  • 相关阅读:
    关于STM32F405的GPIO中断问题
    No section matches selector
    碳元科技估计要炸
    FreeRTOS 时间片,外部中断,任务优先级的一个疑问
    STM32之HAL库、标准外设库、LL库
    suggest braces around empty body in an 'if' statement
    快速搭建Redis缓存数据库
    Docker Centos安装Openssh
    vmdk虚拟机转换为OVF模板,导入esxi
    Redis安装及主从配置
  • 原文地址:https://www.cnblogs.com/Syney/p/7562036.html
Copyright © 2020-2023  润新知