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

面试题

复制代码
一、写出两种情况下的运行结果。第一种如下面的代码所示;第二种是把"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,即为最后结果

相关推荐
计算机学姐23 分钟前
基于SpringBoot的动漫推荐系统【协同过滤推荐算法+词云图+排行榜】
java·vue.js·spring boot·后端·mysql·intellij-idea·推荐算法
一点七加一24 分钟前
Harmony鸿蒙开发0基础入门到精通Day07--JavaScript篇
开发语言·javascript·ecmascript
人邮异步社区28 分钟前
推荐几本学习计算机语言的书
java·c语言·c++·python·学习·golang
qq_574656251 小时前
java后端初始化模版
java·开发语言
毕设源码-朱学姐2 小时前
【开题答辩全过程】以 基于JAVA的市级非物质文化遗产交流平台为例,包含答辩的问题和答案
java·开发语言
小学鸡!3 小时前
Spring Boot通过手机号获取归属地
java·spring boot
pedestrian_h3 小时前
操作系统-线程
android·java·开发语言
A-code3 小时前
C/C++ 中 void* 深度解析:从概念到实战
c语言·开发语言·c++·经验分享·嵌入式
whltaoin4 小时前
【JAVA全栈项目】弧图图-智能图床 SpringBoot+Vue3 :[框架开荒:一文全步骤打通前后端项目全流程]
java·spring boot·vue·开源项目·全栈·cos
Fu1co4 小时前
【Spring Boot】Spring Boot解决循环依赖
java·spring boot·spring