标签: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