一、 类的加载
1. 类加载器根据类的全限定名通过不同渠道以二进制流的方式获取字节码信息。
2. 类加载器加载完类之后,字节码信息(基本信息、常量池、字段、方法、虚方法表)会保存在JVM的方法区中。
3. 方法区生成一个InstanceKlass对象,保存类的信息,此外还会在堆中生成一个java.lang.class对象,我们使用的就是这个对象。
总结:
Java虚拟机将类信息加载到内存中,一份在堆区、一份在方法区,我们开发使用的一般是堆区中的类。
二、类的连接
1. 验证类是否满足Java虚拟机规范
2. 给静态变量赋初值为0
3. 将常量池中的符号引用替换成指向内存的直接引用(就像字符串)
三、初始化
初始化就是执行静态代码块,或者为静态变量赋值。
以下几种情况会触发类的初始化:
1. 访问一个类的静态变量或者静态方法,注意->变量是final修饰的并且右边是常量不会触发初始化
2. 调用Class.forName()方法
3. new一个该类的对象时
4. 执行Main方法的当前类
笔试题:控制台输出什么
解析:
main为程序入口,所以先加载Test1字节码文件并初始化,打印D, 然后又打印A,然后new Test1()执行构造方法,而{}代码块内容编译后是在构造代码的第一行先执行的。故答案为:DACCBCB
有继承的类的初始化
解析:
①子类继承父类,先初始化父类,在初始化子类
②对于成员变量,编译看左边运行看左边,对于方法,编译看左边,运行看右边
故:结果为2
如果没有new对象,成员变量是父类的,所以只初始化父类。a = 1
最后注意:
数组的创建不会导类进行初始化
静态变量使用final修饰,这类变量会在类加载阶段进行初始化
四、使用 五、回收