码迷,mamicode.com
首页 > 其他好文 > 详细

虚拟机类加载机制

时间:2018-09-30 20:07:31      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:invoke   string   定义   end   分配   com   col   子类   使用   

本文参考《深入理解java虚拟机》

虚拟机加载类的过程:

java源程序被编译器编译成class文件后,会被虚拟机的类加载器加载,加载完成后,会为class文件在内存中开辟一块空间用来存储class文件对象,之后对class文件进行校验,准备,解析和初始化,最终形成能被虚拟机使用的java类型,这叫做类加载过程。

过程:

校验:检验class文件的正确性,判断class文件是否对虚拟机的安全造成威胁。

准备:为类成员分配内存空间,值得注意的是,会给静态属性默认赋值,比如 static int a,a的值在内存中默认是0。

解析:将符号引用转为直接引用。

初始化:为准备阶段的类成员赋于我们定义的值。

 

类加载过程图:

技术分享图片

什么时候进行初始化?

1.使用putstatic,new,getstatic,invokestatic这四个字节码命令时进行初始化。

2.子类初始化时需要先把父类初始化。

3.对类进行反射调用时

4.含有主方法的类要被初始化

初始化要点

对于静态字段只有直接定义这个静态字段的类会被初始化。

package com.yqg.test;

public class Cat extends Dog{
       static {
           System.out.println("我是九尾");
       }
}

package com.yqg.test;

public class Dog {
    
    public static  int value = 2;
    static {
        System.out.println("我是神犬");
    }
    
}

package com.yqg.test;

public class Test {
       public static void main(String[] args) {
        System.out.println(Cat.value);
    }
}

结果:

我是神犬
2

 

虚拟机类加载机制

标签:invoke   string   定义   end   分配   com   col   子类   使用   

原文地址:https://www.cnblogs.com/yanqingguo/p/9732954.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!