More on Class Loading and Initialization
阅读原文时间:2023年07月12日阅读:1

  上一篇博客中对于类的加载和初始化进行了详细的说明,但上一篇博客代码中的main()所在的类为导出类,

对其中一些问题的理解可能会引起误导和不明确,所以补充这篇博客进一步说明。以下面的代码为例进行说明:

//File: P130_Practice5.py
//Author: lxw
//Time: 2014-05-31
//Usage: P130 Practice 5.

class A{
static B b = new B();
public A(){
System.out.println("A constructor.");
}
}

class B{
public B(){
System.out.println("B constructor.");
}
}

class C{
public C(){
System.out.println("C constructor.");
}
public void show(){}
}

class E{
static int i = print("WARNING.");
public E(){
System.out.println("E constructor.");
}
static int print(String s){
System.out.println(s);
return ;
}
}

class D extends A{
B b = new B();
static C c = new C();
}

public class P130_Practice5 {
public static void main (String [] args){
D d = new D(); // 顺序是: 先是加载完需要的类(只加载需要的类),然后才执行初始化。
//D.c.show(); // 只加载
E e = new E(); // 顺序是: 先是加载完需要的类(只加载需要的类),然后才执行初始化。
}
}

Output:

lxw@:::~/eclipse/java/javaComLine$ java P130_Practice5
B constructor.
C constructor.
A constructor.
B constructor.
WARNING.
E constructor.

  需要注意的是:  

  B constructor.  -- 加载类A
  C constructor.  -- 加载类D
  A constructor.  -- A()
  B constructor.  -- 初始化类D
  WARNING.      -- 加载类E
  E constructor.  -- E() 

  所以我们可以看出对于每一条语句的执行,类的加载和初始化的顺序是:先加载完所有需要的类(只加载“需要”的类,

不需要的不加载),然后才执行初始化。