程序初始化的顺序
我们先从一段程序开始
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程序的初始化可以看做是代码块的执行,他们的执行顺序如下:
(1)父类的静态变量
(2)父类的静态代码块
(3)子类的静态变量
(4)子类的静态代码块
(5)父类非静态变量
(6)父类非静态代码块
(7)父类构造函数
(5)子类非静态变量
(6)子类非静态代码块
(7)子类构造函数
是不是很难记,初始化呢,只要记住这几个原则
(1)在实例化一个类时,如果发现父类未被实例化,则先实例化父类。因此父类优先于子类进行初始化
(2)静态对象(变量、方法、代码块)优先于非静态对象
(3)代码块中可能有变量的赋值操作,因此变量优先于代码块执行初始化
(4)构造函数处于最后执行,因为构造函数中可能还有变量的赋值操作,因此变量优先于构造函数