Java面试问题之八
Java类在哪些情况下才会被初始化?
答:根据Java虚拟机规范,只有在程序首次主动使用一个类或者接口时才会初始化它。要说明Java类在哪些情况下会被初始化,就是要找出哪些活动被视作程序对类或接口的主动使用。主要6个活动会使得Java类被初始化:
(1)最基本的就是创建类的实例,这个肯定是要对类进行初始化的。创建类的实例的途径主要有:使用new语句创建实例,或者通过反射、克隆以及反序列化手段来创建实例。
(2)调用类的静态方法。
(3)访问某个类或者接口的静态变量,或者对该静态变量赋值。
(4)调用Java API中某些反射方法,比如调用Class.forName("xxx")方法,假定xxx类还没有被初始化,那么forName()方法就会初始化xxx类,然后返回代表这个类的Class实例。
(5)初始化一个类的子类。对子类的初始化可以看作对它父类的主动使用,因此会初始化它的父类。
(6)Java虚拟机启动时被标明为启动类的类。比如,我们使用Java xxx来执行程序,那么这个xxx被看作是启动类,Java虚拟机会首先初始化它。
除了以上6中情况,其他使用Java类的情况都会被看作类的被动使用,都不会导致类的初始化。
举一个例子说明一下Java虚拟机不对类进行初始化的情况:
import java.lang.*;class UnloadedClassTesting{ public static final int a=2*3; static { System.out.println("Class Loaded!!"); }}public class TestInit{ public static void main(String[] args){ System.out.println("a="+UnloadedClassTesting.a); }}
import java.lang.*;import java.util.*;class UnloadedClassTesting{ public static final int a=(int)(Math.random()*10)/10+1; static { System.out.println("Class Loaded!!"); }}public class TestInit{ public static void main(String[] args){ System.out.println("a="+UnloadedClassTesting.a); }}