面试题:单例模式输出静态变量

面试题

复制代码
一、写出两种情况下的运行结果。第一种如下面的代码所示;第二种是把"1=="所在行注释掉,把"2=="行的注释去掉。
class Singleton {
	private static Singleton singleton = new Singleton();	//1==
	static int i;
	static int j = 0;
	//private static Singleton singleton = new Singleton();        //2==
	private Singleton() {
		i++;
		j++;
	}
	public static Singleton getInstance() {
		return singleton;
	}
}
	public static void main(String[] args) {
		Singleton.getInstance();
		System.out.println("i=" + Singleton.i + ",j=" + Singleton.j);
}
结果1:i=1,j=0
结果2:i=1,j=1

前几天面试有这么一道题,我没有搞明白,最后研究了半天原来是加载顺序的问题。

结果一加载顺序:

原因:

1 首先执行main中的Singleton singleton = Singleton.getInstance();

2 类的加载:加载类Singleton

3 类的验证

4 类的准备:为静态变量分配内存,设置默认值。这里为singleton(引用类型)设置为null,i,j(基本数据类型)设置默认值0

5 类的初始化(按照赋值语句进行修改):

执行private static Singleton singleton = new Singleton();

执行Singleton的构造器:value1++;value2++; 此时i,j均等于1

执行

public static int i;

public static int j = 0;

此时i=1,j=0

结果2加载顺序:1 1

原因:

1 首先执行main中的Singleton singleton = Singleton.getInstance();

2 类的加载:加载类Singleton

3 类的验证

4 类的准备:为静态变量分配内存,设置默认值。这里为i,j(基本数据类型)设置默认值0,singleton2(引用类型)设置为null,

5 类的初始化(按照赋值语句进行修改):

执行

public static int i = 0;

此时vi=0(value1不变,依然是0);

执行

private static Singleton singleton = new Singleton();

执行Singleton的构造器:i++;j++;

此时i,j均等于1,即为最后结果

相关推荐
longxiaozhang610 分钟前
C#继承:让代码少写一点,偷懒的好方法
开发语言·c#
吃饱了得干活15 分钟前
限界上下文之后:微服务怎么拆、上下文怎么聊?
java·后端·架构
weixin_4407305022 分钟前
python+request实现接口-参数化小结
开发语言·python
CHHH_HHH28 分钟前
【Linux系统篇】深入解析Linux文件系统:从磁盘寻址到软硬链接
linux·服务器·开发语言·后端·ubuntu
yngsqq36 分钟前
窗体快速取消
java·开发语言
岁月如歌778642 分钟前
一次讲透 Redis 缓存击穿、穿透、雪崩,从原理到实战解决方案
java·后端·架构
XiaQ09191 小时前
Linux 常用命令学习笔记(用户管理篇):用户、组与权限的钥匙
linux·开发语言·笔记·学习
不可求~1 小时前
C++ 报错交给 AI 之前,先准备好这 8 类信息
开发语言·c++·人工智能
名字还没想好☜1 小时前
用 Python struct 解析二进制协议:pack/unpack、字节序与对齐踩坑
开发语言·python·二进制·struct
AI多Agent协作实战派1 小时前
AI多Agent协作系统实战(四十六):改了十次规则,AI员工还是老样子——会话缓存的坑
java·spring·缓存