程序初始化的顺序

我们先从一段程序开始

package day0901;

class A {
public static int a = getA();

static {
System.out.println("父类的静态方法");
}

{
System.out.println("父类的非静态代码块");
}

public A() {
System.out.println("父类的构造函数");
}

public static int getA() {
System.out.println("父类的静态变量");
return 1;
}
}

class B extends A {
public static int b = getB();

static {
System.out.println("子类的静态方法");
}

{
System.out.println("子类的非静态代码块");
}

public B() {
System.out.println("子类的构造函数");
}

public static int getB() {
System.out.println("子类的静态变量");
return 1;
}
}


public class TestLoad {
public static void main(String args[]) {
new B();
}

}

那么输出是怎样的呢?

【JAVA】程序初始化的顺序_父类

为什么呢?

这要了解程序初始化的顺序。


程序初始化的顺序是怎样的呢?

java程序的初始化可以看做是代码块的执行,他们的执行顺序如下:

(1)父类的静态变量

(2)父类的静态代码块

(3)子类的静态变量

(4)子类的静态代码块

(5)父类非静态变量

(6)父类非静态代码块

(7)父类构造函数

(5)子类非静态变量

(6)子类非静态代码块

(7)子类构造函数


是不是很难记,初始化呢,只要记住这几个原则

(1)在实例化一个类时,如果发现父类未被实例化,则先实例化父类。因此父类优先于子类进行初始化

(2)静态对象(变量、方法、代码块)优先于非静态对象

(3)代码块中可能有变量的赋值操作,因此变量优先于代码块执行初始化

(4)构造函数处于最后执行,因为构造函数中可能还有变量的赋值操作,因此变量优先于构造函数