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()
所以我们可以看出对于每一条语句的执行,类的加载和初始化的顺序是:先加载完所有需要的类(只加载“需要”的类,
不需要的不加载),然后才执行初始化。