More on Class Loading and Initialization

  上一篇博客中对于类的加载和初始化进行了详细的说明,但上一篇博客代码中的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 1;
    }
}

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@23:53:04:~/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() 

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

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

原文地址:https://www.cnblogs.com/lxw0109/p/More_on_Initialization_and_class_loading.html