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
目录
相关文章
|
21小时前
|
Java 编译器 ice
【Java开发指南 | 第十五篇】Java Character 类、String 类
【Java开发指南 | 第十五篇】Java Character 类、String 类
13 1
|
22小时前
|
Java 关系型数据库 MySQL
【Java Spring开源项目】新蜂(NeeBee)商城项目运行、分析、总结
【Java Spring开源项目】新蜂(NeeBee)商城项目运行、分析、总结
12 4
|
22小时前
|
安全 Java 开发者
Java一分钟之-文件与目录操作:Path与Files类
【5月更文挑战第13天】Java 7 引入`java.nio.file`包,`Path`和`Files`类提供文件和目录操作。`Path`表示路径,不可变。`Files`包含静态方法,支持创建、删除、读写文件和目录。常见问题包括:忽略异常处理、路径解析错误和权限问题。在使用时,注意异常处理、正确格式化路径和考虑权限,以保证代码稳定和安全。结合具体需求,这些方法将使文件操作更高效。
11 2
|
21小时前
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
17 3
|
21小时前
|
存储 Java ice
【Java开发指南 | 第十六篇】Java数组及Arrays类
【Java开发指南 | 第十六篇】Java数组及Arrays类
8 3
|
9月前
|
存储 Java 数据库
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(中)
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(中)
40 1
|
9月前
|
存储 Java 编译器
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(下)
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(下)
39 0
|
9月前
|
Java 编译器
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(上)
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(上)
48 1
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(上)
|
存储 Java 编译器
【Java SE】static成员及代码块
【Java SE】static成员及代码块
【Java SE】static成员及代码块
|
存储 Java
Java之static成员与代码块
本篇文章主要介绍JavaSE中一些不是很常见的知识点,但也会涉及,需要了解一下
89 0
Java之static成员与代码块