java类的初始化顺序

Posted 店蛋蛋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java类的初始化顺序相关的知识,希望对你有一定的参考价值。

 在java中,当我们new一个对象时,对象中的成员,初始化块以及构造方法的加载是有一定的顺序的,看下面一副图:

    

一、单类(无基类)下的初始化顺序:

public class Parent {

static String staticStr = "父类静态变量";

private String str = "父类成员变量";

 

static {

System.out.println(staticStr);

  System.out.println("父类静态初始化块");

}

 

{

System.out.println(str);

  System.out.println("父类初始化块");

}

 

public Parent() {

  System.out.println("父类构造");

}

 

public static void main(String[] args) {

  new Parent();

     //new Parent();

}

}

输出:父类静态变量

           父类静态初始化块

           父类成员变量

           父类初始化块

           父类构造

            /* 若放开第二行new Parent(),输出结果会增加以下内容:

            父类成员变量

           父类初始化块

           父类构造

            */

单类顺序:  ①静态(成员,块) > 非静态(成员,块) > 构造

                  ②成员和块的顺序取决于“他们在类中定义时的前后位置,谁靠前谁先被初始化”。

                  ③静态成员或块是属于类的,所以优先初始化,且只会初始化一次。

                  ④构造最后被执行。

 

二、继承类的初始化顺序

 

class SubClass extends Parent {

static String staticStr = "子类静态变量";

private String str = "子类成员变量";

 

static {

System.out.println(staticStr);

  System.out.println("子类静态初始化块");

}

 

{

System.out.println(str);

  System.out.println("子类初始化块");

}

 

public SubClass() {

  System.out.println("子类构造");

}

 

public static void main(String[] args) {

System.out.println("子类main方法");

  new SubClass();

}

}

输出:父类静态变量

          父类静态初始化块

          子类静态变量

          子类静态初始化块

          子类main方法

          父类成员变量

          父类初始化块

          父类构造

          子类成员变量

          子类初始化块

          子类构造

继承类顺序:

                ①父类静态(成员,块) > 子类静态(成员,块) > 父类非静态(成员,块) > 父类构造 > 子类非静态(成员,块)> 子类构造

                ②同样的,成员和块的顺序和单类中一样

                ③先有父才有子,但是子类的静态(成员和块)先于父类的非静态(成员和块),因为静态是属于类的;对于非静态和构造,自然是父类中全部加载完毕,再加载子类。

 

关注老姜谈技术,微信号:helojava,或者扫描下面二维码。


每日一帖,技术鸡汤。

以上是关于java类的初始化顺序的主要内容,如果未能解决你的问题,请参考以下文章

jvm系列学习之--Java类的初始化顺序

Java类的初始化顺序

java类的初始化顺序

java类的初始化顺序

Java类的初始化顺序

Java继承类的初始化顺序