`

面试题:单例,还是单例

    博客分类:
  • 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面试题,旨在帮助求职者准备Java...

    Java 最常见的 200+ 面试题:面试必备(附详解答案).zip

    Java作为一门广泛使用的编程语言,其面试题涵盖了各种核心概念和技术。这份名为“Java最常见的200+面试题:面试必备(附详解答案).zip”的压缩包文件,显然是为准备Java开发者面试的人群精心准备的资源。它包含了...

    java面试题及答案(全)

    - 面试题:描述单例模式并给出实现方式。 - 答案:单例模式确保一个类只有一个实例,并提供全局访问点。常见的实现方式有饿汉式、懒汉式(线程不安全和线程安全)以及双重检查锁定。 10. **JVM内存模型** - 面试...

    Java 最常见 200+ 面试题全解析:面试必备208题

    Java作为一门广泛使用的编程语言,其面试题涵盖了众多的知识领域,包括基础语法、面向对象、集合框架、多线程、网络编程、IO流、异常处理、JVM内存模型、设计模式、数据库操作、Spring框架等。以下是对这些知识点的...

    Java 最常见 200+ 面试题全解析:面试必备

    Java作为一门广泛使用的编程语言,其面试题涵盖了基础语法、面向对象、集合框架、多线程、网络编程、异常处理、JVM、设计模式、数据库交互、Spring框架等多个方面。以下是对这些知识点的详细解析: 1. **Java基础**...

    华为面试题华为面试题华为面试题华为面试题华为面试题

    Java作为一门广泛应用的编程语言,其面试题涵盖了众多领域,包括基础语法、数据结构与算法、多线程、网络编程、集合框架、异常处理、设计模式等。以下将针对这些重要知识点进行详尽的阐述。 1. **基础语法**:Java...

    Java初级开发面试题

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

    Java各种必备面试题目程序代码例子与应战技巧.zip

    - 面试题:描述单例模式、工厂模式和装饰器模式的实现方式。 - 实战代码:实现常见设计模式,如单例、工厂、观察者、策略等。 9. **JVM优化**: - 面试题:JVM有哪些运行时区域?如何调整JVM参数以优化性能? -...

    2019互联网面试题第2季,互联网面试题及答案,Java

    "2019互联网面试题第2季"聚焦了这一年度的重要面试趋势和热门问题,旨在帮助求职者更好地准备并理解面试官可能提出的各种问题。这份资料可能包含一系列的面试题目、解答以及相关思维导图,帮助求职者系统地梳理和...

    2018最新最全java高级工程师面试题

    Java作为一门广泛使用的编程语言,其高级工程师面试题往往涵盖了多方面的知识点,旨在考察候选人的技术深度、广度以及实际问题解决能力。2018年最全的Java高级工程师面试题集锦,包含了十几个文档,可以预见这些文档...

    Java 面试全解析:核心知识点与典型面试题.zip

    设计模式是软件工程中的最佳实践,通过34个常见面试题,你可以了解并复习单例、工厂、观察者、装饰器、代理等经典模式,以及如何在实际项目中应用它们。 2. **Spring 框架** - 25-Spring 核心功能演示 + 面试题....

    java面试题大全(阿里面试题)

    Java面试题大全,尤其是阿里面试题,是求职者准备Java开发者职位面试的重要参考资料。这份资料集涵盖了广泛的Java编程、设计模式、数据结构、算法、框架、数据库、并发等多个领域的知识点,旨在帮助求职者全面理解...

    IT互联网名企经典面试题汇总:Java篇 (2).pdf

    【IT互联网名企经典面试题汇总:Java篇】 在IT行业,尤其是互联网企业,Java作为主流的编程语言,其面试题涵盖了多个方面,包括但不限于语言特性、设计模式、数据库操作、并发处理、框架理解以及项目实践经验。以下...

    1000道Java公司最新面试题(包过很多公司的面试题)

    Java作为一门广泛使用的编程语言,其面试题涵盖了众多领域,包括但不限于基础知识、数据结构与算法、JVM原理、多线程、并发编程、设计模式、框架应用、数据库操作以及项目经验等。以下是对"1000道Java公司最新面试题...

    Java面试题全集(上)(中)(下)合集

    Java作为一门广泛使用的编程语言,其面试题涵盖了众多的知识领域,包括基础语法、面向对象、集合框架、多线程、网络编程、IO流、数据库操作、设计模式、JVM优化、异常处理、反射机制等。这里我们将根据"Java面试题...

    java经典面试题与世界500强面试题

    Java作为全球广泛使用的编程语言,尤其在企业级应用开发中占据主导地位,因此Java的经典面试题及世界500强的面试逻辑题是求职者必须准备的重要内容。这些题目不仅测试了候选人的技术实力,还考察了他们的逻辑思维、...

    JAVA面试题 人事面试 Java技术面试

    11. **英文版面试题**:Java面试题和答案(英文版).doc提供了英文面试环境下的准备材料,有助于提高英文技术交流的能力。 通过阅读和理解这些文档,你可以系统地复习和准备Java面试,同时,针对不同的面试阶段(如...

Global site tag (gtag.js) - Google Analytics