打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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的初始化。
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
java对象的初始化顺序
JAVA-类加载(类的生命周期)
java内部类及类加载顺序
JVM类加载的那些事
你对Java类加载器(自定义类加载器)有了解吗?
static{}语句块详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服