今天表弟问道一个面试题,结果票眼一看,尽然我回答错误了。值得深思:
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面试题:单例设计模式
【Java面试题】单例的写法
【计算机和JAVA 面试题大全】 在计算机科学与技术领域,尤其是软件开发行业,Java是一种广泛应用的编程语言,以其跨平台、面向对象和高效性而受到赞誉。本资料集涵盖了丰富的Java面试题,旨在帮助求职者准备Java...
Java作为一门广泛使用的编程语言,其面试题涵盖了各种核心概念和技术。这份名为“Java最常见的200+面试题:面试必备(附详解答案).zip”的压缩包文件,显然是为准备Java开发者面试的人群精心准备的资源。它包含了...
- 面试题:描述单例模式并给出实现方式。 - 答案:单例模式确保一个类只有一个实例,并提供全局访问点。常见的实现方式有饿汉式、懒汉式(线程不安全和线程安全)以及双重检查锁定。 10. **JVM内存模型** - 面试...
Java作为一门广泛使用的编程语言,其面试题涵盖了众多的知识领域,包括基础语法、面向对象、集合框架、多线程、网络编程、IO流、异常处理、JVM内存模型、设计模式、数据库操作、Spring框架等。以下是对这些知识点的...
Java作为一门广泛使用的编程语言,其面试题涵盖了基础语法、面向对象、集合框架、多线程、网络编程、异常处理、JVM、设计模式、数据库交互、Spring框架等多个方面。以下是对这些知识点的详细解析: 1. **Java基础**...
Java作为一门广泛应用的编程语言,其面试题涵盖了众多领域,包括基础语法、数据结构与算法、多线程、网络编程、集合框架、异常处理、设计模式等。以下将针对这些重要知识点进行详尽的阐述。 1. **基础语法**:Java...
Java面试题包括但不限于: Java基础知识:语法、面向对象编程、集合、多线程、异常处理等。 Java高级特性:反射、泛型、枚举、注解、 Lambda表达式等。 Java虚拟机:Java内存模型、垃圾回收、类加载机制等。 ...
- 面试题:描述单例模式、工厂模式和装饰器模式的实现方式。 - 实战代码:实现常见设计模式,如单例、工厂、观察者、策略等。 9. **JVM优化**: - 面试题:JVM有哪些运行时区域?如何调整JVM参数以优化性能? -...
"2019互联网面试题第2季"聚焦了这一年度的重要面试趋势和热门问题,旨在帮助求职者更好地准备并理解面试官可能提出的各种问题。这份资料可能包含一系列的面试题目、解答以及相关思维导图,帮助求职者系统地梳理和...
Java作为一门广泛使用的编程语言,其高级工程师面试题往往涵盖了多方面的知识点,旨在考察候选人的技术深度、广度以及实际问题解决能力。2018年最全的Java高级工程师面试题集锦,包含了十几个文档,可以预见这些文档...
设计模式是软件工程中的最佳实践,通过34个常见面试题,你可以了解并复习单例、工厂、观察者、装饰器、代理等经典模式,以及如何在实际项目中应用它们。 2. **Spring 框架** - 25-Spring 核心功能演示 + 面试题....
Java面试题大全,尤其是阿里面试题,是求职者准备Java开发者职位面试的重要参考资料。这份资料集涵盖了广泛的Java编程、设计模式、数据结构、算法、框架、数据库、并发等多个领域的知识点,旨在帮助求职者全面理解...
【IT互联网名企经典面试题汇总:Java篇】 在IT行业,尤其是互联网企业,Java作为主流的编程语言,其面试题涵盖了多个方面,包括但不限于语言特性、设计模式、数据库操作、并发处理、框架理解以及项目实践经验。以下...
Java作为一门广泛使用的编程语言,其面试题涵盖了众多领域,包括但不限于基础知识、数据结构与算法、JVM原理、多线程、并发编程、设计模式、框架应用、数据库操作以及项目经验等。以下是对"1000道Java公司最新面试题...
Java作为一门广泛使用的编程语言,其面试题涵盖了众多的知识领域,包括基础语法、面向对象、集合框架、多线程、网络编程、IO流、数据库操作、设计模式、JVM优化、异常处理、反射机制等。这里我们将根据"Java面试题...
Java作为全球广泛使用的编程语言,尤其在企业级应用开发中占据主导地位,因此Java的经典面试题及世界500强的面试逻辑题是求职者必须准备的重要内容。这些题目不仅测试了候选人的技术实力,还考察了他们的逻辑思维、...
11. **英文版面试题**:Java面试题和答案(英文版).doc提供了英文面试环境下的准备材料,有助于提高英文技术交流的能力。 通过阅读和理解这些文档,你可以系统地复习和准备Java面试,同时,针对不同的面试阶段(如...