JVM那些事儿(七)-----类加载机制

2017-01-05  本文已影响24人  evil_ice
一,类加载机制

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制

二,类加载的时机----什么时候类进行加载?

需要注意的是:

1,对于静态字段,只有直接定义这个字段的类才会被初始化,因此通过子类来引用父类中定义的静态字段,
只会触发父类的初始化而不会触发子类的初始化
2,常量(final)在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义常量的类,因此不会
触发定义常量的类的初始化
3,当接口初始化时,并不要求其父接口全部都完成了初始化,只有在真正使用到父接口的时候(如引用接口
中定义的常量)才会初始化.
三,类加载的过程

java虚拟机中类加载的全过程----加载,链接(验证,准备,解析),初始化
1,加载
在加载阶段,虚拟机需要完成以下三件事情

2,验证

3,准备
准备阶段是正式为类变量分配内存并设置初始化值的阶段.这些变量所使用的内存都将在方法区中进行分配

4,解析

5,初始化
初始化阶段是执行类构造器<clinit>()方法的过程

四,练习题

1,打印结果是什么?

class SingleTon {
    private static SingleTon singleTon = new SingleTon();
    public static int count1;
    public static int count2 = 0;
 
    private SingleTon() {
        count1++;
        count2++;
    }
 
    public static SingleTon getInstance() {
        return singleTon;
    }
}
 
public class Test {
    public static void main(String[] args) {
        SingleTon singleTon = SingleTon.getInstance();
        System.out.println("count1=" + singleTon.count1);
        System.out.println("count2=" + singleTon.count2);
    }
}

2,打印结果是什么?

public class Test {

    public static int k = 0;
    public static Test t1 = new Test("t1");
    public static Test t2 = new Test("t2");
    public static int i = print("i");
    public static int n = 99;
    private int a = 0;
    public int j = print("j");
    {
        print("构造块");
    }
    static {
        print("静态块");
    }

    public Test(String str) {
        System.out.println((++k) + ":" + str + "   i=" + i + "    n=" + n);
        ++i;
        ++n;
    }

    public static int print(String str) {
        System.out.println((++k) + ":" + str + "   i=" + i + "    n=" + n);
        ++n;
        return ++i;
    }

    public static void main(String args[]) {
        Test t = new Test("init");
    }

}

参考:
1,<<深入理解Java虚拟机 JVM高级特性与最佳实践 第二版 周志明>>

上一篇 下一篇

猜你喜欢

热点阅读