Java - 类变量(static)初始化过程案例分析

简介: Java - 类变量(static)初始化过程案例分析

案例一

class SingleTon {
  private static SingleTon singleTon = new SingleTon();
  public static int count1;
  public static int count2 = 0;
  private SingleTon() {
    // 下面 ++ 之前, count1、count2 都是零值(默认)【准备阶段】
    count1++;
    count2++;
    // 此时 count1 == 1、count2 == 1, 但并还没到【初始化阶段】, 因为现在还在执行第一条 static 语句的过程中
  }
  public void fun() {
    count2++;
  }
  public static SingleTon getInstance() {
    return singleTon;
  }
}
public class Test {
  public static void main(String[] args) {
    SingleTon singleTon = SingleTon.getInstance();
    // new 完了后
    // count1 == 1: 因为它没有初始化阶段用户给的赋值, 所以保持不变还是 1
    // count2 == 0: 因为按顺序下来, 初始化 count2, 赋值用户定义的 0 给它
    System.out.println("count1=" + singleTon.count1);
    System.out.println("count2=" + singleTon.count2);
    singleTon.fun();
    // 因为已经初始化过了
    System.out.println("count2=" + singleTon.count2);
  }
} 

输出结果

count1=1
count2=0
count2=1

案例二

class SingleTon {
  public static int count1;
  public static int count2 = 0;
  // 这就是为什么在案例一中说注意这条的顺序, 因为在执行它之前上面已经初始化完毕
  private static SingleTon singleTon = new SingleTon();
  private SingleTon() {
    count1++;
    count2++;
  }
  public void fun() {
    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);
    singleTon.fun();
    System.out.println("count2=" + singleTon.count2);
  }
}

输出结果

count1=1
count2=1
count2=2

案例三

class SingleTon {
  public static int count1;
  public static int count2 = 0;
  private static SingleTon singleTon = new SingleTon();
  private SingleTon() {
    count1++;
    count2++;
  }
  public void fun() {
    count2++;
  }
  public static SingleTon getInstance() {
    return singleTon;
  }
}
public class Test {
  public static void main(String[] args) {
    // 没想到不会报 NPE 吧, 因为 static 属于类定义, 所以也只是借此调用
    SingleTon singleTon = null;
    System.out.println("count1=" + singleTon.count1);
    System.out.println("count2=" + singleTon.count2);
  }
}

输出结果

count1=1
count2=1
目录
相关文章
|
5月前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
275 0
|
5月前
|
存储 Java Go
【Java】(3)8种基本数据类型的分析、数据类型转换规则、转义字符的列举
牢记类型转换规则在脑海中将编译和运行两个阶段分开,这是两个不同的阶段,不要弄混!
288 2
|
6月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
7月前
|
安全 Java 编译器
new出来的对象,不一定在堆上?聊聊Java虚拟机的优化技术:逃逸分析
逃逸分析是一种静态程序分析技术,用于判断对象的可见性与生命周期。它帮助即时编译器优化内存使用、降低同步开销。根据对象是否逃逸出方法或线程,分析结果分为未逃逸、方法逃逸和线程逃逸三种。基于分析结果,编译器可进行同步锁消除、标量替换和栈上分配等优化,从而提升程序性能。尽管逃逸分析计算复杂度较高,但其在热点代码中的应用为Java虚拟机带来了显著的优化效果。
224 4
|
7月前
|
机器学习/深度学习 安全 Java
Java 大视界 -- Java 大数据在智能金融反洗钱监测与交易异常分析中的应用(224)
本文探讨 Java 大数据在智能金融反洗钱监测与交易异常分析中的应用,介绍其在数据处理、机器学习建模、实战案例及安全隐私等方面的技术方案与挑战,展现 Java 在金融风控中的强大能力。
|
8月前
|
存储 Java 大数据
Java 大视界 -- Java 大数据在智能家居能源消耗模式分析与节能策略制定中的应用(198)
简介:本文探讨Java大数据技术在智能家居能源消耗分析与节能策略中的应用。通过数据采集、存储与智能分析,构建能耗模型,挖掘用电模式,制定设备调度策略,实现节能目标。结合实际案例,展示Java大数据在智能家居节能中的关键作用。
|
9月前
|
数据采集 搜索推荐 算法
Java 大视界 -- Java 大数据在智能教育学习社区用户互动分析与社区活跃度提升中的应用(274)
本文系统阐述 Java 大数据技术在智能教育学习社区中的深度应用,涵盖数据采集架构、核心分析算法、活跃度提升策略及前沿技术探索,为教育数字化转型提供完整技术解决方案。
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
269 1
|
5月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
288 1
Java 数据库 Spring
249 0