java类的初始化顺序

高洛峰
高洛峰 原创
2016-11-03 13:17:37 1179浏览

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

2.jpg

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

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方法

父类成员变量

父类初始化块

父类构造

子类成员变量

子类初始化块

子类构造

继承类顺序:

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

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

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


声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
上一条:Java final自变量 下一条:Java日期转换