首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

与虚拟机加载器相关

2012-08-29 
与虚拟机加载器有关?一 ?Java和C++的一个显著不同之处在于,它的对象是动态加载的,C++无法模仿。? ? ? JVM有

与虚拟机加载器有关

?

一 ?Java和C++的一个显著不同之处在于,它的对象是动态加载的,C++无法模仿。

? ? ? JVM有一个组成部分--原生类加载器。它只加载可信类(比如Java API类库)。如果有WebStart类型的应用需求,或者企业级应用(RMI通信等等),则可能会在加载器链条上放上一些别的加载器。

?

二 ? ? 什么时候类会被加载呢?

? ? ?当一个类第一次被使用的时候,它最早可以追溯到对它的静态成员的第一次引用的时候,它就会被加载。由此可以推理:

? ? ?1 实际上构造器也是一个静态成员,虽然它没有使用static关键字。如果做个试验我们就会发现,即使一个没有任何static成员的类中,它在初始化的时候,还是要先初始化父类的构造器--这就好像父类的构造器是一个静态成员一样。所以实际上所有的构造器都是静态成员。

?

? ? ?2 因为所有的静态成员都是一次性初始化的,所以初始化顺序为

? ? ?父类静态成员 - ?父类构造器 - 本类静态成员 - 本类构造器。

? ? ? 值得注意的是,类在生命引用的时候就被加载了,但只有当对静态成员进行引用(更直接地说,访问)的时候,他们才被初始化。值得注意的地方有:

? ? ?1 除非强制访问编译时常量 final static,否则这种编译时展开的静态常量不算一种初始化,不会引发其他的初始化。

? ? ?2 任何一个对于静态成员的访问,都必须等到所有静态初始化结束以后才能开始。比如我在一个static的变量a前写一个static的print方法b,在我打印a的时候,实际上b先打印。

?

?

?

?

? ? ?为了类的使用而做的准备工作实际上包含三个步骤:

?

? ? 1 加载 用字节码生成一个Class对象。

? ? 2 链接 验证字节码,为静态存储区域分配内存空间。

? ? 3 初始化 按照初始化的顺序初始化。实际上初始化放在第三步,相当于被推迟了。

热点排行