Java虚拟机类加载机制

类的主动加载时机:
1、当遇到new、getstatic、putstatic、invokestatic这4条指令时,如果类没有进行初始化,则首先进行初始 化。出现这些指令的代码有:用new关键字实例化对象的时候、读取或设置一个类的静态字段的时候(不包括static final 字符),以及调用一个类的静态方法的时候。
2、使用反射的时候;
3、当虚拟机启动时,用户需要指定一个要执行的主类,这个类必须初始化
4、当初始化一个类的时候,如果其父类没有初始化,则需要首先初始化父类,前提是当要初始化一个类的时候。
除了以上的“主动初始化”之外,其他的初始化都成为被动初始化。
例如:
public class SuperClass{
        static {
         system.out.println("super");
}
public static int value=123;
}
public class Sublass extends SuperClass{
        static {
         system.out.println("subclass");
}
 
}
public class NotInitialization{
   public static void main(String[] args){
     system.out.println(Subclass.value);
}
}
此时只会输出 super。对于静态字段,中有直接定义这个字段的类才会被初始化,通过子类引用父类中定义的静态变量,只会触发父类的初始化,而不会触发子类的初始化,至于子类的初始化取决于虚拟机的实现。
还有初始化一个对象数组的时候也不会触发该对象的初始化。例如
SuperClass[ ]   scs=new SuperClass[100];
此时只会触发一个由虚拟机自动生成的"[LSuperClass"的类的初始化阶段,由字节码newarray 触发。
还有一种被动初始化的例子
public class ConstClass {
   static {
    system.out.printl("const");
}
   public static final int age =123; 
}
public class NotInitialization{
     public static void main(String[ ] args){
     system.out.println(ConstClass.age);
}
此时并不会出现 “const”,因为在NotInitialization类在变异的时候已经把ConstClass中的变量age放在常量池中了,访问时直接取出age即可,不会引发ConstClass的初始化。
}

你可能感兴趣的:(JAVA虚拟机)