当java程序首次通过下面6种方式来使用某个类或接口时,系统就会初始化该类或接口.
对于final修饰的类变量,如果赋了值,那么这个变量的值在编译时就可以确定下来,那么这个类变量就相当于"宏变量",编译器会在编译时直接把这个类变量出现的地方换成它的值,因此即使程序使用该静态变量,也不会导致该类的初始化
使用final static修饰的变量在在编译时值可以确定下来,将相当于使用常量
如果在编译的时候确定不下来,必须等到运行时才可以确定该变量的值,那么通过该类来访问这个类变量,还是会导致该类初始化
当时用classloader类的loadclass()方法来加载某个类时,该方法只是加载该类,并不会执行该类的初始化
- 创建类的实例,比如: 使用new操作符来创建实例, 通过反射来创建实例, 通过反序列化来创建实例.
- 调用某个类的类方法(static修饰的)
- 访问某个类或接口的类变量,为该类变量赋值
- 使用反射方式来强制创建某个类或接口对应的java.lang.class对象.比如Class.forName(),如果系统还未初始化这个类,则这行代码将会导致该类初始化,返回该类的对象
- 初始化某个类的子类,会导致该类的所有父类初始化(双亲委派机制)\
- 直接使用命令java.exe来运行某个主类