Static块和类加载顺序

原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11451040.html 

 

版本:Java8

直接上代码:

public class StaticMain {

    public static int i = 200;

    {
        i = 100;
    }

    public static void main(String[] args){
        System.out.println(i);
    }
}

结果:

 

继续上代码:

public class StaticMain {

    {
        i = 100;
    }

    public static int i = 200;

    public static void main(String[] args){
        System.out.println(i);
    }
}

结果:

 

继续上代码:

public class StaticMain {

    {
        i = 100;
        System.out.println(i + " : static");
    }

    public static int i = 200;

    public static void main(String[] args){
        System.out.println(i + " : main");
    }
}

结果:

 

 继续上代码:

public class StaticMain {

    public static int i = 200;

    {
        i = 100;
        System.out.println(i + " : static");
    }

    public static void main(String[] args){
        System.out.println(i + " : main");
    }
}

结果:

 

 继续上代码:

public class StaticMain {

    public static int i;

    {
        i = 100;
        System.out.println(i + " : static");
    }

    public static void main(String[] args){
        System.out.println(i + " : main");
    }
}

结果:

 

 继续上代码:

public class StaticMain {

    public static int i;

    {
        i = 100;
        System.out.println(StaticMain.i + " : static");
    }

    public static void main(String[] args){
        System.out.println(StaticMain.i + " : main");
    }
}

结果:

 

接下来改变一下:

继续上代码:

public class StaticMain {

    public static int i;

    {
        i = 100;
        System.out.println(StaticMain.i + " : static");
    }

    public static void main(String[] args){
        StaticMain staticMain = new StaticMain();
        System.out.println(StaticMain.i + " : main");
    }
}

结果:

 

 继续上代码:

public class StaticMain {

    public static int i = 200;

    {
        i = 100;
        System.out.println(StaticMain.i + " : static");
    }

    public static void main(String[] args){
        StaticMain staticMain = new StaticMain();
        System.out.println(StaticMain.i + " : main");
    }
}

结果:

 

 继续上代码:

public class StaticMain {

    {
        i = 100;
        System.out.println(StaticMain.i + " : static");
    }

    public static int i = 200;

    public static void main(String[] args){
        StaticMain staticMain = new StaticMain();
        System.out.println(StaticMain.i + " : main");
    }
}

结果:

 

结论: 静态块中的变量是先拿到定义再在后续拿到实际变量之后再进行后续对变量的操作的; 如果不初始化静态块所属类,静态块将不会因为他的所属类的调用而被加载.

 附:类初始化时的顺序: 

   1、类内容(静态变量、静态初始化块) => 实例内容(变量、初始化块、构造器)
   2、父类的(静态变量、静态初始化块)=> 子类的(静态变量、静态初始化块)=> 父类的(变量、初始化块、构造器)=> 子类的(变量、初始化块、构造器)

 

结束🔚

posted @ 2019-09-03 09:17  前往幸福的路上  阅读(897)  评论(0编辑  收藏  举报