Java的静态变量初始化的坑

在网上看到一个很有意思的题目,题目如下

1class SingleTon { 2 private static SingleTon singleTon = new SingleTon(); 3 public static int count1; 4 public static int count2 = 1; 5 6 private SingleTon() { 7 count1++; 8 count2++; 9 } 10 11 public static SingleTon getInstance() { 12 return singleTon; 13 } 14} 15 16public class Test { 17 public static void main(String[] args) { 18 SingleTon singleTon = SingleTon.getInstance(); 19 System.out.println("count1=" + singleTon.count1); 20 System.out.println("count2=" + singleTon.count2); 21 } 22}

最开始的时候以为非常简单就是  count1=1 和 count2=2,但是实际在eclipse里面运行一下才发现答案是错的

这是就涉及到实例的初始化流程

1.类被加载的时候,普通方法加载到方法区,静态方法和静态字段加载到方法区中的静态区

2.首先静态字段会进行默认初始化。即 singTon=null       count1=0        count2=0

3.然后静态字段会进行显示初始化。问题就出现这里(这里就是影响结果的地方)

4.首先 singTon 进行显示初始化 它会创建 实例,调用构造函数,执行完成以后 此时 count1=1   count2=1

5.然后才是静态变量 count1和count2进行显示初始化,因为count1没有显示初始化值,所以结果就是 count1=1 但是 count2变量进行完显示初始化后值就为 1了  (在此过程之前静态变量count1和count2还没有进行显示初始化的)

6.然后执行静态代码块中的内容,此处没有静态代码块。

所以,综上 结果是 singTon.count1=1  singTon.count2=1

如果是以下这种情况

1class SingleTon { 2 public static int count1; 3 public static int count2 = 1; 4 private static SingleTon singleTon = new SingleTon(); 5 6 private SingleTon() { 7 count1++; 8 count2++; 9 } 10 11 public static SingleTon getInstance() { 12 return singleTon; 13 } 14} 15 16public class Demo { 17 public static void main(String[] args) { 18 SingleTon singleTon = SingleTon.getInstance(); 19 System.out.println("count1=" + singleTon.count1); 20 System.out.println("count2=" + singleTon.count2); 21 } 22}

执行的结果就是 count1=1 count2=2

因为这种情况下, 静态变量 count2比 singTon 先完成显示初始化,结果就是我们预料到的

查看详细解释 请参考 http://www.cnblogs.com/javaee6/p/3714716.html?utm_source=tuicool&utm_medium=referral

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )