`

面试题:单例,还是单例

    博客分类:
  • java
阅读更多

今天表弟问道一个面试题,结果票眼一看,尽然我回答错误了。值得深思:

package com.io.test;

class Singleton {

	private static Singleton singleton = new Singleton();

	public static int counter1;

	public static int counter2 = 0;

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

	public static Singleton getInstance() {
		return singleton;
	}
}

public class IoDemo01 {

	public static void main(String[] args) {

		Singleton singleton = Singleton.getInstance();

		System.out.println("counter1:" + singleton.counter1);
		System.out.println("counter2:" + singleton.counter2);
	}
}

 

 

答案是:1和0

 

为什么?其实很简单,因为static初始化是线性的。

1. 静态变量singleton导致new Singleton

2. Singleton构造函数导致counter1,counter2都变成1了

3. public static int counter2 = 0; 初始化又变为0了.

 

所以结果就变成了输出:counter1:1      counter2:0

可能有人就要问了,为什么public static int counter1;不会变成再此初始化为0?

其实这就是关键所在。所有的引用类型的静态变量默认为null, 数值为0,bool为false,这些都是发生在静态初始化之前的. 这也是为什么在构造函数中还未执行到初始化counter1时,他++就等于1的原因,而不是一个乱序的数字.

 

 

通过javap这些初始化也是看不见的,除非像count2 = 0那样手动赋值的情况。下面是通过查看javap的一段过程

 

 

1.IoDemo这个类导致Singleton加载.

 

 

2.Singleton的clinit调用


 


3. 看见上面init了吧,构造函数开始调用:分别给counter1++, counter2++



 

4. 上面return后就回到图1, 再把counter2设置为0.



 
 

这也是为什么结果1和0了。

 

 

 

实际上扯了这么多也和单例没半毛钱关系,但是现在单例一般都写成这种方式,所以有时想初始化一些东西时,static的顺序就显得格外重要,避免犯类似的错误。

  • 大小: 20.9 KB
  • 大小: 25.9 KB
  • 大小: 28.7 KB
  • 大小: 6.4 KB
分享到:
评论

相关推荐

    02_JavaSE面试题:单例设计模式.avi

    02_JavaSE面试题:单例设计模式

    【Java面试题】单例的写法

    【Java面试题】单例的写法

    Java初级开发面试题

    Java面试题包括但不限于: Java基础知识:语法、面向对象编程、集合、多线程、异常处理等。 Java高级特性:反射、泛型、枚举、注解、 Lambda表达式等。 Java虚拟机:Java内存模型、垃圾回收、类加载机制等。 ...

    Python经典面试题 Python常见面试考试题目整理总结 Python面试题手册 共15页.pdf

    Python经典面试题 Python常见面试考试题目整理总结 Python面试题手册 1:Python 如何实现单例模式? 2:什么是 lambda 函数? 3:Python 是如何进行类型转换的? 4:Python 如何定义一个函数 5:Python 是如何进行...

    2023Java高频面试题

    Java面试题主要涉及Java语言本身、常用的Java框架和技术、面向对象编程、多线程编程、算法和数据结构等方面。通常包括以下主要内容: Java基础知识:Java的基本数据类型、变量、运算符、控制语句等基础概念。 面向...

    张汝泉面试作品(ogre+qt+vtk)

    2、用了简单设计模式:单例、观察者、和命令模式 3、支持撤销和前进 4、可以导入ogre的mesh模型,将mesh数据转化为vtk数据,然后再用ogre的manualobject渲染。 5、加入的算法主要有2d三角剖分、插值、设置法线、颜色...

    操作系统面 试题 单例模式

    操作系统面试题,我的一次面试考试,随便查了一些资料,已做参考,有想要的可以来看看.

    【大厂面试题总结】JavaSE面试题总结详细教程

    【大厂面试题总结】JavaSE面试题总结详细教程: 目录: 递归算法之输出某个目录下所有文件和子目录列表 泛型中extends和super的区别 内部类的理解 深入理解Java的反射机制 深入理解Java异常体系 谈谈NIO的理解 谈一...

    【大厂面试题总结】JavaSE面试题合集及其答案,基本包括javaSE所有知识点和详细解释

    【大厂面试题总结】JavaSE面试题合集及其答案,基本包括javaSE所有知识点和详细解释 。 JavaSE面试题总结详细教程: 目录: 递归算法之输出某个目录下所有文件和子目录列表 泛型中extends和super的区别 内部类的理解...

    JAVA-SSH面试题

    JAVA-SSH面试题:1.谈谈你mvc的理解,2.struts1.2和struts2.0的区别?如何控制两种框架中的单例模式?,3.Hibernate缓存

    Java 基础面试题

    该文档主要整理了常见的Java基础面试题,包含以下内容: 1. 抽象类和接口的区别 2. 什么时候使用抽象类,什么时候使用接口 3. 八大基本数据类型,所占字节数 4. List、Set、Map的区别 5. 什么情况下使用List、...

    JAVA工程师面试题和一些经典题

    JAVA工程师面试题和一些经典题

    2024年Java高工面试题 2024年Java高工面试题 2024年Java高工面试题

    2024年Java高工面试题 JVM虚拟机:堆、方法区(元空间)、栈(线程)、本地方法栈、程序计数器 栈帧:局部变理表、操作数栈、动态链接、方法出口 对象组成:对象头(Mark Word、KlassPointer类型指针、数组长度)、...

    看了这篇文章,你能和面试官畅谈单例模式

    目的就是,让小白能搞懂单例模式,以及单例模式的经典面试题。为什么说是小白也能懂的呢?哈哈哈,还不是小胖也是一个小白~~~ 二、单例模式的解释 单例模式定义:一个类只能有一个实例,且该类能自行创建这个实例的...

    JAVA开发五年程序员简历模版

    Java面试专题课解决面试过程中的一些常见问题,课程全面覆盖重难点Java面试题。包含了多个模块的面试题讲解,如:Redis、MySQL、框架、微服务、消息中间件、数据结构、Java集合源码分析、多线程、JVM、设计模式、高...

    Python面试练习题目 Python面试题进阶版 Python笔试题目整理归纳 共7页.pdf

    Python面试练习题目 Python面试题进阶版 Python笔试题目整理归纳 目录 Python面试题 1 1 基础面试 2 1.1 Python如何实现单例模式? 2 1.2 什么是lambda函数? 2 1.3 Python是如何进行类型转换的? 3 1.4 Python如何...

    Java实例高难度面试题及解析 - 展现你的编程实力!

    本篇文章提供了20道高难度的Java实例面试题及详细解析,旨在帮助开发者展示出卓越的编程实力。在面试中,Java实例是考察面试者对面向对象编程和Java语言特性的理解能力的重要方面。通过这些高难度问题,您将全面掌握...

Global site tag (gtag.js) - Google Analytics