Java的静态变量初始化的坑
在网上看到一个很有意思的题目,题目如下
class SingleTon {
private static SingleTon singleTon = new SingleTon();
public static int count1;
public static int count2 = ; private SingleTon() {
count1++;
count2++;
} public static SingleTon getInstance() {
return singleTon;
}
} public class Test {
public static void main(String[] args) {
SingleTon singleTon = SingleTon.getInstance();
System.out.println("count1=" + singleTon.count1);
System.out.println("count2=" + singleTon.count2);
}
}
最开始的时候以为非常简单就是 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
如果是以下这种情况
class SingleTon {
public static int count1;
public static int count2 = ;
private static SingleTon singleTon = new SingleTon(); private SingleTon() {
count1++;
count2++;
} public static SingleTon getInstance() {
return singleTon;
}
} public class Demo {
public static void main(String[] args) {
SingleTon singleTon = SingleTon.getInstance();
System.out.println("count1=" + singleTon.count1);
System.out.println("count2=" + singleTon.count2);
}
}
执行的结果就是 count1=1 count2=2
因为这种情况下, 静态变量 count2比 singTon 先完成显示初始化,结果就是我们预料到的
查看详细解释 请参考 http://www.cnblogs.com/javaee6/p/3714716.html?utm_source=tuicool&utm_medium=referral
Java的静态变量初始化的坑的更多相关文章
- java非静态变量初始化
java费静态变量的初始化分为两种情况,一种是局部变量,一种是类的域. 对于类的域,java在类初始化时,会为变量赋一个初始值.对于基本数据类型,java会将初始值设置为二进制0,具体为将boolea ...
- Java静态变量初始化的坑
class SingleTon { private static SingleTon singleTon = new SingleTon(); public static int count1; pu ...
- Java静态方法,静态变量,初始化顺序
1. 静态方法: 成员变量分为实例变量和静态变量.其中实例变量属于某一个具体的实例,必须在类实例化后才真正存在,不同的对象拥有不同的实例变量.而静态变量被该类所有的对象公有(相当于全局变量),不需要实 ...
- 类加载, 静态变量初始化, String不可变, 泛型使用, 内部类
1.java变量类型 java变量类型分:基本数据类型变量和Object数据类型变量,变量也是占用者内存的 例如: int i = 3; i这个变量保存的就是整形3, 占32位 Object a = ...
- java中静态变量,静态代码块,静态方法,实例变量,匿名代码块等的加载顺序
转自:http://blog.csdn.net/mrzhoug/article/details/51581994 一.在Java中,使用”{}”括起来的代码称为代码块,代码块可以分为以下四种: 1.普 ...
- Java中类成员变量初始化顺序
一. 定义处默认初始化vs构造函数中初始化 java中类成员变量支持在声明处初始化,也可以在构造函数中初始化,那么这两者有什么区别呢?看下面例子 public class FieldsInit { p ...
- Java中静态变量与非静态变量的区别
感谢大佬:https://www.cnblogs.com/liuhuijie/p/9175167.html ①java类的成员变量有俩种: 一种是被static关键字修饰的变量,叫类变量或者静态变量 ...
- Java中静态变量的声明位置
Java中静态变量只能是成员变量,局部方法中的局部变量除final外不能有任何其他修饰符,例如: public class Test { static String x = "1" ...
- 谈谈java中静态变量与静态方法在有继承关系的两个类中调用
谈谈java中静态变量与静态方法在有继承关系的两个类中调用 学习的中如果遇到不明白或者不清楚的的时候,就是自己做些测试,自己去试试,这次我就做一个关于静态变量和静态方法在有继承关系的两个类中的问题测试 ...
随机推荐
- C# HTTP系列4 HttpWebRequest.CookieContainer属性
系列目录 [已更新最新开发文章,点击查看详细] HttpWebRequest.CookieContainer 获取或设置与此请求关联的 Cookie.默认情况下CookieContainer ...
- 【网络知识之四】HTTP/2
一.HTTP/1.1存在的问题 1.TCP 连接数限制2.线头阻塞 (Head Of Line Blocking) 问题3.Header 内容多,而且每次请求 Header 不会变化太多,没有相应的压 ...
- ASP.NET Core基于微软微服务eShopOnContainer事件总线EventBus的实现
这个EventBus的实现是基于微软微服务https://github.com/dotnet-architecture/eShopOnContainers项目的,我把它从项目中抽离出来,打包成nuge ...
- Python【每日一问】38
问: 基础题: 设计一个经营杠杆系数函数DOL,它包含三个参数,S为营业收入,C为变动成本总额,F为固定成本的总额. 已知2018年的S为20,C为11,F为3,求2019年的经营杠杆系数. 提高题: ...
- proxy 简化版本
public interface People { public String eat(String param); } public class Jack implements People { @ ...
- C语言memset()函数:将内存的前n个字节设置为特定的值
头文件:#include <string.h> memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为: void * memset( void * ptr, in ...
- JS操作摄像头
<script src="javascript/jquery-1.9.1.min.js"></script> <fieldset> <le ...
- golang学习笔记 ---rand
在Golang中,有两个包提供了rand,分别为 "math/rand" 和 "crypto/rand", 对应两种应用场景. "math/rand ...
- springboot xss防护
概述 XSS(Cross Site Script)全称跨站脚本攻击,为了跟CSS区分开来,所以变成了XSS.它允许恶意代码植入到正常的页面中,盗取正常用户的账号密码,诱使用户访问恶意的网站. 攻击 实 ...
- .net Core 学习笔记(实体字段映射,IOC注入)
https://github.com/wj1034184751/ADO.NetCore.git 先简单的做一个学习架子, EF层用的是 EFCore(2.1.0)+ Pomelo.EntityFram ...