声明:此篇文章只讲述Demo,用案例来证明,若不清楚创建对象的过程请看我之前的文章:
Java虚拟机(一)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。
|