1 待解析例子
public class Hello {
private static String name="test";
private int age = 10;
public static void main(String[] args) {
Hello hello = new Hello();
}
}
2 加载的过程
第一步 类加载器先将字节码文件Hello.class加载到JVM的方法区中,并且经过了(加载、验证、准备、解析、初始化)步骤。
-
准备阶段:将类变量初始化,这里name是类变量,所以在准备阶段初始化为null,如byte=0, short=0, int=0, long=0L, char=' ', boolean=false, float=0.0f, double=0.0d, 引用类型=null。
-
初始化阶段:将设置的值赋给类变量,比如将类变量name在初始化阶段设置为"test"(符号引用转为地址引用,指向常量池)。
第二步 在方法区加载Hello,找到main方法,会将main方法加载到线程栈中,并且执行main方法。
第三步 线程栈main中解析碰到了new关键字会执行如下操作。
第四步 线程栈中声明对象Hello hello。
-
堆中创建对象的执行过程
-
1 加载实例变量如age进入开辟的内存中。
-
将实例变量age 加载入开辟好的内存中。
-
初始化age=0。
-
初始化age=10。
-
执行构造方法如下2
-
-
2 执行构造方法就是<init>方法。
-
第五步 在JVM堆中申请一片内存空间,将Hello相关信息如实例变量、实例方法等从方法区加载到堆内存中。
第六步 将对象的声明hello(即对象引用)指向堆内存中开辟的对象。
参考自Q群:Java交流讨论一群(250431014)-群主的帮助