Java静态变量初始化的坑
class SingleTon {
    private static SingleTon singleTon = new SingleTon();
    public static int count1;
    public static int count2 = 1;  
    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);
    }
}  
执行结果:singTon.count1=1 singTon.count2=1
class SingleTon {
    public static int count1;
    public static int count2 = 1;
    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
private static SingleTon singleTon = new SingleTon(); 这句代码再static int ...之前只影响未被赋值的变量,在static int...之后,全部影响
原因:实例的初始化流程
1.类被加载的时候,普通方法加载到方法区,静态方法和静态字段加载到方法区中的静态区
2.首先静态字段会进行默认初始化。即 singTon=null count1=0 count2=0
3.然后静态字段会进行显示初始化。问题就出现这里(这里就是影响结果的地方)
4(第一个例子先执行4).首先 singTon 进行显示初始化 它会创建 实例,调用构造函数,执行完成以后
5(第二个例子先执行5).然后才是静态变量 count1和count2进行显示初始化
6.然后执行静态代码块中的内容,此处没有静态代码块。
Java静态变量初始化的坑的更多相关文章
- java 静态变量初始化
		java 静态变量在编译阶段就已经明确位置, 所以静态变量的声明与初始化在编码顺序上可以颠倒.也就是说可以先编写初始化的代码,再编写声明代码.如: public class Test { // 静态变 ... 
- Java的静态变量初始化的坑
		在网上看到一个很有意思的题目,题目如下 class SingleTon { private static SingleTon singleTon = new SingleTon(); public s ... 
- Java静态变量的初始化(static块的本质)
		Java静态变量的初始化(static块的本质) 标签: javaclassstring编译器jdk工作 2010-02-06 07:23 33336人阅读 评论(16) 收藏 举报 分类: Jav ... 
- 类加载, 静态变量初始化, String不可变, 泛型使用, 内部类
		1.java变量类型 java变量类型分:基本数据类型变量和Object数据类型变量,变量也是占用者内存的 例如: int i = 3; i这个变量保存的就是整形3, 占32位 Object a = ... 
- Java实例变量初始化
		由一道面试题所想到的--Java实例变量初始化 时间:2015-10-07 16:08:38 阅读:23 评论:0 收藏:0 [点我收藏+] 标签:java ... 
- java非静态变量初始化
		java费静态变量的初始化分为两种情况,一种是局部变量,一种是类的域. 对于类的域,java在类初始化时,会为变量赋一个初始值.对于基本数据类型,java会将初始值设置为二进制0,具体为将boolea ... 
- Java静态方法,静态变量,初始化顺序
		1. 静态方法: 成员变量分为实例变量和静态变量.其中实例变量属于某一个具体的实例,必须在类实例化后才真正存在,不同的对象拥有不同的实例变量.而静态变量被该类所有的对象公有(相当于全局变量),不需要实 ... 
- java 静态变量生命周期(类生命周期)
		Static: 加载:java虚拟机在加载类的过程中为静态变量分配内存. 类变量:static变量在内存中只有一个,存放在方法区,属于类变量,被所有实例所共享 销毁:类被卸载时,静态变量被销毁,并释放 ... 
- java静态变量、静态方法和静态代码段
		先上实例 public class TestStatic { public static String staticString = "this is a static String&quo ... 
随机推荐
- SpringBoot quartz定时器
			<!-- 案例1 --> <!-- 定时器 --> <bean name="CodeTest" class="com.aaa.bbb.con ... 
- (原)pytorch中使用TensorRT
			转载请注明出处: https://www.cnblogs.com/darkknightzh/p/11332155.html 代码网址: https://github.com/darkknightzh/ ... 
- 使用Qemu运行Ubuntu文件系统 —— 搭建SVE学习环境(2)
			开发环境 PC:ubuntu18.04 Qemu:4.1 Kernel:Linux-5.2 概述 由于要学习ARM的SVE技术,但是目前还没有支持SVE指令的板子,所以只能用Qemu来模拟,但是发现Q ... 
- Nginx 核心配置-根目录root指令与别名alias指令实战案例
			Nginx 核心配置-根目录root指令与别名alias指令实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.试验环境说明 1>.虚拟机环境说明 [root@nod ... 
- 大数据技术原理与应用【第五讲】NoSQL数据库:5.1 NoSQL概论&5.2 NoSQL与关系数据库的比较
			5.1 NoSQL概论 最初:反SQL 概念演变,现在:Not only SQL 特点: 1.灵活的可扩展性 所以支持海量数据存储 2.灵活的数据模型 例如:HBase 3.和云计算的紧密结合 (一) ... 
- <人人都懂设计模式>-中介模式
			真正的用房屋中介来作例子, 好的书籍总是让人记忆深刻. class HouseInfo: def __init__(self, area, price, has_window, has_bathroo ... 
- centos7下搭建JDK和Hadoop
			涉及基础操作命令 这里只是将涉及到的提了下一下具体的使用还需要读者自己查阅资料 tar 解压命令 su 进入root用户模式 rm -rf 删除 cd /文件名/.../ 进入某个文件夹下 注意要逐层 ... 
- luoguP5495:Dirichlet 前缀和
			题意:给定数组a[]的生成方式,然后b[i]=∑a[j] ,(i%j==0),求所有b[i]的异或和.所有运算%2^32; 思路:高维前缀和的思想,先筛出所有素数,然后把每个素数当成一维,那么分开考 ... 
- jQuery的Promise 这里介绍的很详细
			原文电梯:https://www.cnblogs.com/yelongsan/p/7644239.html 先前了解了ES6的Promise对象,来看看jQuery中的Promise,也就是jQuer ... 
- hdu5285-wyh2000 and pupil-(染色法二分图判定)
			http://acm.hdu.edu.cn/showproblem.php?pid=5285 题意:把互不认识的人分到两个组,第一组人数尽可能多. 题解:把互不认识的人连起来,当作二分图,二分图可能有 ... 
