使用Class.forName(),为了产生Class引用,会立即执行静态块的初始化,但不执行构造器方法
而使用对象.class来创建对对象的引用时,则事实上做了以下3步事情:
1:加载 这是由类加载器完成的,该步骤将查找字节码文件,然后创建一个class对象
2:链接 该步骤将验证类中的字节码,为静态域分配存储空间
3:初始化 将执行类的静态块的初始化工作
注意:该初始化会延迟到对该class对象的第一次使用上,但事实也并非如此
这里先介绍下编译期常量概念
如果一个类里定义了static final 类型的变量 则该变量属于编译期常量 它会在类加载的时候,就执行了
所以如果试图调用该类的其他类型变量,则会强制进行该类的初始化(也即执行它的静态方法和静态语句块),来获得一个Class引用。
而使用对象.class来创建对对象的引用时,则事实上做了以下3步事情:
1:加载 这是由类加载器完成的,该步骤将查找字节码文件,然后创建一个class对象
2:链接 该步骤将验证类中的字节码,为静态域分配存储空间
3:初始化 将执行类的静态块的初始化工作
注意:该初始化会延迟到对该class对象的第一次使用上,但事实也并非如此
这里先介绍下编译期常量概念
如果一个类里定义了static final 类型的变量 则该变量属于编译期常量 它会在类加载的时候,就执行了
所以如果试图调用该类的其他类型变量,则会强制进行该类的初始化(也即执行它的静态方法和静态语句块),来获得一个Class引用。