为了进一步理解类的初始化过程,这里有必要进一步区分一下类的实例化(类实例)和类的对象实例化(对象实例),我们通常所说的实例化都是指对象实例化。

我们可以把类的使用简单分为三个过程:类加载,类实例化,对象实例化。
类的加载:由Java虚拟机根据需求将要用的类加载到内存中,让类的代码处于可用状态;对于解释型虚拟机来说,这个代码就直接可解释执行,而对于采用即时编译(JIT)技术来说,虚拟机一般会在方法第1次调用时将字节码编译成目标机器语言,而且是要多少编译多少。类的加载在一个程序运行期间一般只执行一次。
类实例化:其实实例化主要是为成员变量分配空间,代码本身当然无所谓实例化,都是公共的。类之所以要实例化主要是因为类可以拥有静态变量的缘故,必须为类的这些静态成员分配空间,并执行这些静态成员变量的初始化操作;类的实例化在一个程序运行期间,也只执行一次;另外需要注意的是类的加载可以从本地执行,也可以从远程获取,因为类的代码本质上来说也是一些数据(字符序列)。
对象实例化:类是一些具有共同特征和行为的对象的静态描述(一种数据类型),对象实例化就是将类作为模子为每个对象分配具体的内存空间形成独立的实体;当然,这里的分配空间主要是针对成员变量,成员方法都是些代码,是所有对象共有的,因此并不需要重新分配空间来保存一份代码的复制品。
上面的上个过程,后面的过程执行都需要前面的过程已经执行过。
对于类A来说,如果类A没有被加载,那么A.class的调用会导致类的加载,但不会导致类实例化。而Class.forName("A")的调用,不仅会执行类加载,还会执行类实例化。其实这个方法还有一个重载方法,可以指明是否进行类实例化,而且还可以指定是本地加载还是远程加载(利用ClassLoader)。