NullPointer 发表于 2016-12-21 09:44

Java虚拟机创建对象的过程Demo(一)

声明:此篇文章只讲述Demo,用案例来证明,若不清楚创建对象的过程请看我之前的文章:
Java虚拟机(一)Java虚拟机(二)Java虚拟机(三)

package object;

/**
* 验证创建对象的过程
*
* @author TongWei.Chen
* @date 2016年12月21日09:26:31
*/
public class CreateObjDemo01 {
        private static CreateObjDemo01 singleton = new CreateObjDemo01();
        public static int counter1;
        public static int counter2 = 0;

        private CreateObjDemo01() {
                counter1++;
                counter2++;
        }

        public static CreateObjDemo01 getInstance() {
                return singleton;
        }
       
        public static void main(String[] args) {
                CreateObjDemo01 singleton = CreateObjDemo01.getInstance();
               
                System.out.println("counter1 = " + singleton.counter1);
                System.out.println("counter2 = " + singleton.counter2);
        }
}

如上这个程序,本人在未深入学习java虚拟机之前,猜想会输入1,1, 不知道你们是否和我一样都以为是1,1。
实际结果为1,0
下面就进行讲解为什么会是1,0。
1、首先类会被加载、解析、初始化
2、然后会在堆内存中为对象分配空间大小(包括对象以及对象的实例字段,实例字段拥有默认初始值,比如String是null,int是0等)
3、这时候按顺序执行和初始化。首先会执行private static CreateObjDemo01 singleton = new CreateObjDemo01();,执行构造器(构造器中将counter1和counter2都++操作,这里都变成了1)。
4、执行第二句话:public static int counter1; 这时候counter1的值没有发生任何变化,所以还是1
5、执行第三句话:public static int counter2 = 0;,这里为counter2重新赋值为0,所以counter2为0

如何证明我说的是对的?
请大家自己将private static CreateObjDemo01 singleton = new CreateObjDemo01();这句话放到public static int counter2 = 0;的下面,再次运行查看结果,会变成1,1。
页: [1]
查看完整版本: Java虚拟机创建对象的过程Demo(一)