首页 > 代码库 > Initialization and Class loading - Java

Initialization and Class loading - Java

  可以说,类的代码在初次使用时才加载。这通常指加载发生于创建类的第一个对象之时,但当访问

static域或static方法时,也会发生加载。

  所有的static对象和static代码段会在加载时按照程序中的顺序(定义类时的书写顺序)而依次初始化。

  本文将以下面的代码为例展开论述:

class Insect {
  private int i = 9;
  protected int j;
  Insect() {
    System.out.println("i = " + i + ", j = " + j);
    j = 39;
  }
  private static int x1 =
    printInit("static Insect.x1 initialized");
  static int printInit(String s) {
    System.out.println(s);
    return 47;
  }
}

public class Beetle extends Insect {
  private int k = printInit("Beetle.k initialized");
  public Beetle() {
    System.out.println("k = " + k);
    System.out.println("j = " + j);
  }
  private static int x2 =
    printInit("static Beetle.x2 initialized");
  public static void main(String[] args) {
    System.out.println("Beetle constructor");
    //Beetle b = new Beetle();    // 1 
    //Beetle b;    //2
  }
}

Output:

lxw@11:03:16:~/eclipse/java/javaComLine$ java Beetle 
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor

Analyze:

  程序执行后,将试图访问main(),于是开始启动并找出Beetle类的编译代码,在加载的过程中编译器注意到它有一个基类,于是先对基类进行加载。

此时基类中的static初始化开始被执行,然后执行导出类中的static初始化。”先执行基类然后再执行导出类“的原因是导出类的static初始化可能会依赖于基

类成员是否被初始化。

  简略的说就是:基类的static数据成员初始化 -> 导出类的static数据成员初始化 -> main()

  至此,不管代码中是否创建一个基类或导出类的对象都执行这些步骤。