Java类初始化顺序,大神3个示例带你躺坑。。

来源:互联网 发布:js中split函数 编辑:程序博客网 时间:2024/05/16 07:34

最近发现微信群里面有些群友在讨论类的初始化顺序,如类的静态变量、成员变量、静态代码块、非静态代码块、构造器,及继承父类时,它们的初始化顺序都是怎样的,下面我通过例子来说明这个情况,以免被人误导。

示例1:测试单类的初始化顺序

public class ClassInitOrderTest {    public static String staticField = "static field";    static {        System.out.println(staticField);        System.out.println("static block");    }    private String field = "member field";    {        System.out.println(field);        System.out.println("non-static block");    }    public ClassInitOrderTest() {        System.out.println("constructor");    }    public static void main(String[] args) {        new ClassInitOrderTest();    }}

程序输出:

static fieldstatic blockmember fieldnon-static blockconstructor

可以得出以下结论:

静态变量 > 静态初始块 > 成员变量 > 非静态初始块 > 构造器

示例2:测试类继承的初始化顺序

class Parent {    private static String parentStaticField = "parent static field";    static {        System.out.println(parentStaticField);        System.out.println("parent static block");    }    private String parentField = "parent member field";    {        System.out.println(parentField);        System.out.println("parent non-static block");    }    public Parent() {        System.out.println("parent constructor");    }}public class Child extends Parent {    private static String childStaticField = "child static field";    static {        System.out.println(childStaticField);        System.out.println("child static block");    }    private String childField = "child member field";    {        System.out.println(childField);        System.out.println("child non-static block");    }    public Child() {        System.out.println("child constructor");    }    public static void main(String[] args) {        new Child();    }}

程序输出:

parent static fieldparent static blockchild static fieldchild static blockparent member fieldparent non-static blockparent constructorchild member fieldchild non-static blockchild constructor

可以得出以下结论:

父类静态变量 > 父类静态初始块 > 子类静态变量 > 子类静态初始块 > 父类成员变量 > 父类非静态初始块 > 父类构造器 > 子类成员变量 > 子类非静态初始块 > 子类构造器

示例3:测试成员变量、初始块的初始化顺序

从上面两个例子可以看出,父类的静态变量和静态初始块肯定是先于子类加载的。但同一个类中的静态变量与静态初始块之间,成员变量与初始块之间的顺序一定是变量先于初始块吗?继续演示!

public class TestOrder {    private static A a = new A();    static {        System.out.println("static block");    }    private static B b = new B();    public static void main(String[] args) {        new TestOrder();    }}class A {    public A() {        System.out.println("static field A");    }}class B {    public B() {        System.out.println("static field B");    }}

程序输出:

static field Astatic blockstatic field B

可以得出以下结论:

静态变量A > 静态初始块 > 静态变量B

所以,它们的在类中的顺序就决定了它们的初始化顺序,而不是变量一定会优先于初始块。

推荐阅读


去BAT面试完的Mysql面试题总结(55道,带完整答案)

阿里高级Java面试题(首发,70道,带详细答案)

2017派卧底去阿里、京东、美团、滴滴带回来的面试题及答案

Spring面试题(70道,史上最全)

通往大神之路,百度Java面试题前200页。

分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。


原创粉丝点击