JVM加载机制详解(4)
2023-05-02 来源:飞速影视
这时候进行内存分配的仅仅是类变量(被static修饰的变量),而不是实例变量,实例变量将会在对象实例化的时候随着对象一起分配在Java堆中
这个阶段赋初始值的变量指的是那些不被final修饰的static变量,比如"public static int value = 123",value在准备阶段过后是0而不是123,给value赋值为123的动作将在初始化阶段才进行;比如"public static final int value = 123;"就不一样了,在准备阶段,虚拟机就会给value赋值为123。 下面两段代码,A类将会输出 0,而 B类 将无法通过编译。
public class A { static int a; public static void main(String[] args) { System.out.println(a); }}
public class B { public static void main(String[] args) { int a; System.out.println(a); }}
这是因为局部变量不像类变量那样存在准备阶段。类变量有两次赋初始值的过程,一次在准备阶段,赋予初始值(也可以是指定值);另外一次在初始化阶段,赋予程序员定义的值。因此,即使程序员没有为类变量赋值也没有关系,它仍然有一个默认的初始值。但局部变量就不一样了,如果没有给它赋初始值,是不能使用的。
1.3.2.3 解析Resolution
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。 什么是符号引用? 符号引用是一种定义,可以是任何字面上的含义,而直接引用就是直接指向目标的指针、相对偏移量。 这个其实是属于编译原理方面的概念,符号引用包括了下面三类常量:
类和接口的全限定名
字段的名称和描述符
方法的名称和描述符
这么说可能不太好理解,结合实际看一下,写一段很简单的代码:
public class TestMain { private static int i; private double d; public static void print() { } private boolean trueOrFalse() { return false; }}
本站仅为学习交流之用,所有视频和图片均来自互联网收集而来,版权归原创者所有,本网站只提供web页面服务,并不提供资源存储,也不参与录制、上传
若本站收录的节目无意侵犯了贵司版权,请发邮件(我们会在3个工作日内删除侵权内容,谢谢。)
www.fs94.org-飞速影视 粤ICP备74369512号