吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2948|回复: 0
收起左侧

[Java 转载] Java虚拟机创建对象的过程Demo(一)

[复制链接]
NullPointer 发表于 2016-12-21 09:44
声明:此篇文章只讲述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。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-9-23 15:20

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表