Java入门之了解JVM(21)

注意不要混淆【初始化】和【实例化】,初始化是对类成员进行初始化,而实例化是在初始化的基础上建立的,实例化会生成对象并完成实例变量的赋值,即会在堆内存中开辟空间

注意以下几种情况不会执行类初始化:

通过子类引用父类的静态字段,只会触发父类的初始化,而不会触发子类的初始化。通过类名获取Class对象,不会触发类的初始化。通过Class.forName加载指定类时,如果指定参数initialize为false时,也不会触发类初始化,其实这个参数是告诉虚拟机,是否要对类进行初始化。通过ClassLoader默认的loadClass方法,也不会触发初始化动作。关于类加载器

在《深入理解Java虚拟机》中有句这样的话,”比较两个类是否’相等‘,只有在这两个类是有同一个类加载器加载的前提下才有意义,否则,即使这两个类来源与同一个Class文件,被同一个JVM加载,只要加载它们的类加载器不同,那么这两个类就必定不相等“,即就算是同一个class文件,但由不同的类加载器去加载的话就会生成两个不同的class对象,这点要注意,这是理解双亲委派模型的大前提以下为类加载器的双亲委派模型(图片源自网络)

推荐阅读