Java世界系统分析师

JVM—【03】认识Java类的生命周期、类加载的过程、双亲委派

2020-01-11  本文已影响0人  苡仁ilss

1. 初识类加载


2. 类的生命周期

JVM 类的声明周期
> 常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义常量的类,因此不会触发定义常量类的初始化。这里有个需要说明的地方,如果是在本类如第一处使用调用,是会加载ConstClass这个类的,这里说的是在非本类的中调用这个常量不会初始化ConstClass,这是因为**Java在编译阶段通过常量传播优化,已经将hello world的值存到了NotInitialization类的常量池中**,NotInitialization对“常量HELLO_WORLD的引用”都变成了对自身常量池的引用,实际上**NotInitialization中不会有任何ConstClass类的符号引用**,这两个类在编译成Class之后就不存在任何联系了。

```java
package io.ilss.main;

/**
* @author yiren
* @date 2019-08-20
**/
public class ConstClass {
    static {
        System.out.println("ConstClass init");
    }

    public static final String HELLO_WORLD = "hello world";
    
    public static void main(String[] args) { // 1
        System.out.println(HELLO_WORLD);
    }
}


package io.ilss.main;

import static io.ilss.main.ConstClass.HELLO_WORLD;

/**
* @author yiren
* @date 2019-08-20
**/
public class NotInitialization {
    public static void main(String[] args) { // 2
        System.out.println(HELLO_WORLD);
    }
}
```

> 接口和类的加载略有不同,接口也有初始化过程,接口中没有static{}代码块,但是编译器仍会为接口生成`<clinit>()`类构造器,用于初始化接口中定义的成员变量。接口与类真正的区别的是有且仅有的类初始化场景的第三种:当一个类在初始化时,要求其父类全部都已初始化过了,但是在接口中,并不会要求其父接口全部都完成了初始化,只有在真正使用到父接口的时候才会初始化(如去引用接口中定义的常量)

3. 类的加载过程


3.1. 加载


3.2. 验证


3.3. 准备


3.4. 解析


3.5. 初始化


4. 类加载器


4.1 类与类加载器


4.2. 双亲委派模型


4.3. 破坏双亲委派


关于我

上一篇下一篇

猜你喜欢

热点阅读