在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方法
父类成员变量
父类初始化块
父类构造
子类成员变量
子类初始化块
子类构造
继承类顺序:
①父类静态(成员,块) > 子类静态(成员,块) > 父类非静态(成员,块) > 父类构造 > 子类非静态(成员,块)> 子类构造
②同样的,成员和块的顺序和单类中一样
③先有父才有子,但是子类的静态(成员和块)先于父类的非静态(成员和块),因为静态是属于类的;对于非静态和构造,自然是父类中全部加载完毕,再加载子类。