• java 静态代码加载顺序和特性


    1、静态代码块格式:

    static
    {
      执行语句
    }

    特点:随着类的加载而执行,且只执行一次,并优先于主函数。用于给类初始化的。

    2、执行顺序:

    示例一

    静态代码块随着类加载而加载

    有多个静态代码块的,按代码块前后顺序加载

    一个代码块,只执行一次。

    复制代码
    package javastudy;
    
    class StaticCode1{        
        static{                                //第4步。由第3步触发。
            System.out.println("x");
        }
    }
    
    public class StaticDemo2 {
        static{                                //第1步。先加载主函数所在类,所以先加载并执行这段静态代码块。
            System.out.println("y");
        }    
        public static void main(String[] args) {
            new StaticCode1();                //第3加载StaticCode1类。
            new StaticCode1();                //不执行。静态代码块只执行一次
            System.out.println("over");        //第5步。输出打印。
        }
        static{                                //第2步。多个静态代码块之前,按前后顺序执行
            System.out.println("z");
        }
    }
    复制代码

    输出:

    y
    z
    x
    over

    示例二

    复制代码
    public class StaticDemo1 {                             
    
        public static void main(String[] args) {
            StaticDemo1 t1=new StaticDemo1();    //第2步,初始化构造函数,i=9
            System.out.println(t1.i);            //第3步,按顺序执行,9
            speak();                            //第4步,按顺序执行,调用静态函数
            
        }    
        static int i=1;                            //静态变量存到静态区域。    
        static void speak()                        //静态函数存到静态区域。调用时执行。
        {
            System.out.println("a");;
        }
        static {                                //第1步,静态代码块随着类的加载,优先执行且只执行一次。i=3,i+3打印结果是4。
            i=i+3;
            System.out.println(i);
        }
        
        public StaticDemo1(){                    //构造方法,初始化时执行。
            i=i+5;                                //i=9
            System.out.println(i);    
        }
    }
    复制代码

    输出:

    4
    9
    9
    a

    示例三

    复制代码
    package javastudy;
    
    public class StaticDemo2 {
        public static void main(String[] args) {
        }
        static{                    //随类加载就执行,不需要实例化
            System.out.println("z");
        }
    }
    复制代码

    输出:

    z

    示例四

    复制代码
    class StaticCode2{        
        
        StaticCode2(){                        //没有调用。
            System.out.println("aa");
        }
        static{                                //1 静态代码块先执行
            System.out.println("x");
        }
        {                                    //2 对象的构造代码块。给对象初始化的。
            System.out.println("cc");
        }
        
        StaticCode2(int i){                    //3 被调用
            System.out.println("aa");
        }
        public static void show(){                //静态方法,没有调用。
            System.out.println("gogogo");
        }
    }
    
    public class StaticDemo4 {
        public static void main(String[] args) {
            new StaticCode2(4);                    
        }
    
    }
    复制代码

    输出:

    x
    cc
    aa

    示例五

    复制代码
    public class StaticDemo5 {
        static int i=1;
        static{                            
            System.out.println("a");        //第1步。a。且只执行一次
            i++;                            //i=i+1,结果2
        }    
        public StaticDemo5(){
            System.out.println("c");        //第2步。
            i++;                            //i=i+1,结果3
        }
        
        public static void main(String[] args) {
            StaticDemo5 t1=new StaticDemo5();
            System.out.println(t1.i);        //第3步。3
            
            StaticDemo5 t2=new StaticDemo5();    //第4步。c。第二次创建实例。static静态代码块不执行。
            System.out.println(t2.i);        //第5步。又执行了一次StaticDemo5()构造函数。4
        }
    }
    复制代码

    输出:

    a
    c
    3
    c
    4

     创建第二个对象StaticDemo5 t2=new StaticDemo5()时,其实i已经先于对象存在于静态区域

    博主长期对外收徒,欢迎咨询。
    《编程语言设计和实现》《MUD游戏开发》《软件破解和加密》《游戏辅助外挂》《JAVA开发》 以上课程非诚勿扰!



    =================================
    QQ:184377367
    GOLang Q群:6848027
    电子电路入门群 436173132
    C/C++/QT群 1414577
    单片机嵌入式群 306312845
    MUD/LIB/巫师交流群 391486684
    java/springboot/hadoop/ 群 4915800
    WEB前端开发交流群 214737701
    操作系统研发群:15375777
    Linux公社Q群:812742841
    汇编/辅助/破解新手群:755783453
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    流程控制语句
    java运算符
    变量
    java虚拟机
    常量
    java注释
    java标识符
    单击显示随机文字
    2018/6/25~2018/6/29 周记
    2018/6/19~2018/6/22 周记
  • 原文地址:https://www.cnblogs.com/cfas/p/14854382.html
Copyright © 2020-2023  润新知