设为首页 加入收藏

TOP

Java动态性: 类加载时的延迟初始化
2014-11-24 11:55:04 来源: 作者: 【 】 浏览:0
Tags:Java 动态性 加载 时的 延迟 初始

误区:值得注意的是,需要搞清楚 对符号引用的解析 和类的初始化的区别。


Java类的动态加载机制规定,在类被主动使用(active use)之前,必须已经完成类的初始化。


既然有主动调用,那么就有被动调用了。这两者有哪些区别呢?


主动使用的情况:


1. 创造该类的一个新的实例


2.调用这个类中的静态方法


3.获取类或者接口中的非常量的静态变量


4.利用反射调用方法。


5.初始该类的某子类。


6.被制定为JVM开始运行时必须初始化的类。


注意:


首先,3中为何是“非常量的静态变量”。如果是常量,即声明为final的话,并不会出现对类的构造,虽然调用时有类名出现,但实际调用会直接使用常量,绕过了类的限制(详情见相关constant pool 和 runtime constant pool的知识)。


只有当一个非常量的静态变量被显示的在类或接口中声明时,它的调用才属于主动调用。对于父类中某非常两静态变量的调用属于被动使用(positive use),


如下代码



运行的结果是:


虽然有出现Son,但Son.i访问的是父类的非常量静态变量。于是没有对Son类进行初始化,而只是初始化了明确的声明静态变量的Parent类。


由此可见,一般的,我们在某个类中定义了其他类的成员变量引用,只要该变量没有 new 出一个新的 对象,则JVM也不会初始化这个类,类此时只是被加载了而已,而没有链接 和初始化。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java类的装载(Loading)、链接(Lin.. 下一篇Java类的实例化探究

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++ Lambda表达式保 (2025-12-26 05:49:45)
·C++ Lambda表达式的 (2025-12-26 05:49:42)
·深入浅出 C++ Lambda (2025-12-26 05:49:40)
·C语言指针从入门到基 (2025-12-26 05:21:36)
·【C语言指针初阶】C (2025-12-26 05:21:33)