黑马程序员技术交流社区
标题:
详解字节码加载时接口的常量加载过程和赋值情况
[打印本页]
作者:
齐浩
时间:
2015-5-23 19:26
标题:
详解字节码加载时接口的常量加载过程和赋值情况
本帖最后由 齐浩 于 2015-5-23 19:28 编辑
详解字节码加载时接口的常量加载过程和赋值情况,还有与abstract的关系等。。。。。请详细解释一下。。。
作者:
lhwinner
时间:
2015-5-23 19:43
一个java文件从被加载到被卸载这个生命过程,总共要经历5个阶段:
加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载
其中加载(除了自定义加载)+链接的过程是完全由jvm负责的,什么时候要对类进行初始化工作(加载+链接在此之前已经完成了),jvm有严格的规定(五种情况):
1.遇到new,getstatic,putstatic,invokestatic这4条字节码指令时,假如类还没进行初始化,则马上对其进行初始化工作。其实就是3种情况:用new实例化一个类时、读取或者设置类的静态字段时(不包括被final修饰的静态字段,因为他们已经被塞进常量池了)、以及执行静态方法的时候。
2.使用java.lang.reflect.*的方法对类进行反射调用的时候,如果类还没有进行过初始化,马上对其进行。
3.初始化一个类的时候,如果他的父亲还没有被初始化,则先去初始化其父亲。
4.当jvm启动时,用户需要指定一个要执行的主类(包含static void main(String[] args)的那个类),则jvm会先去初始化这个类。
5.用Class.forName(String className);来加载类的时候,也会执行初始化动作。注意:ClassLoader的loadClass(String className);方法只会加载并编译某类,并不会对其执行初始化。
作者:
黄冬
时间:
2015-5-23 21:20
前排学习二楼讲解
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2