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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/cfas/p/14854382.html