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

Posted 程序员牧码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Java - 类变量(static)初始化过程案例分析的主要内容,如果未能解决你的问题,请参考以下文章

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

java 静态变量生命周期(类生命周期)(转)

Java面向对象(OOP)--static修饰符(static变量static方法代码块和静态代码块创建和初始化对象的过程静态导入)

java 静态变量生命周期(类生命周期)

Java中final和static关键字总结

JAVA面试题 浅析Java中的static关键字