Welcome to

Vcode

首页 / Java / 类的初始化

类的初始化

JVM: 加载------>验证------>准备------>解析-------->初始化-------->使用------->卸载


下面几种不会触发类的初始化

1. 通过子类引用父类的静态字段,只会触发父类的初始化,而不会触发子类的初始化。

2. 定义对象数组,不会触发该类的初始化。

3. 常量在编译期间会存入调用类的常量池中,本质上并没有直接引用定义常量的类,不会触

发定义常量所在的类。

4. 通过类名获取 Class 对象,不会触发类的初始化。

5. 通过 Class.forName 加载指定类时,如果指定参数 initialize 为 false 时,也不会触发类初

始化,其实这个参数是告诉虚拟机,是否要对类进行初始化。

6. 通过 ClassLoader 默认的 loadClass 方法,也不会触发初始化动作。


类加载器:


image.png


双亲委派机制:

当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父

类去完成,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中,

只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的

Class),子类加载器才会尝试自己去加载。

采用双亲委派的一个好处是比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载

器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载

器最终得到的都是同样一个 Object 对象。

image.png

本文暂无评论

发表评论

您的电子邮件地址不会被发布。

>> <<