• Java类的静态块の二


    在上一篇Java类的静态块の一中介绍到:类的静态块在类加载时候执行,执行早于构造函数,并且只执行一次。

    但是在下面的例子中却发现JVM并不是把把所有的static模块都执行完成再执行其他(Java果然是解释性语言):

     1 /**
     2  * 单例模式 之 饿汉模式
     3  * 
     4  * @author Administrator
     5  *
     6  */
     7 public class SingletonStarving {
     8     static {
     9         System.out.println("this is Starving Singleton3");
    10     }
    11 
    12     /*
    13      * 1.将构造方法私有化,不能从外部直接创建对象
    14      */
    15     private SingletonStarving() {
    16         System.out.println("this is Starving Singleton2");
    17     }
    18 
    19     static {
    20         System.out.println("this is Starving Singleton5");
    21     }
    22 
    23     /*
    24      * 2.声明类的唯一实例,使用private static修饰
    25      */
    26     private static SingletonStarving instance= new SingletonStarving();
    27 
    28     static {
    29         System.out.println("this is Starving Singleton4");
    30     }
    31 
    32     /*
    33      * 3.提供一个用于获取实例的方法,使用public static修饰
    34      */
    35     public static SingletonStarving getInstance() {
    36         return instance;
    37     }
    38 
    39     public void print() {
    40         System.out.println("this is Starving Singleton");
    41     }
    42 
    43     public static void main(String[] args) {
    44         for (int i = 0; i < 2; i++) {
    45             SingletonStarving.getInstance().print();
    46         }
    47     }
    48 }

    输出结果:

    this is Starving Singleton3
    this is Starving Singleton5
    this is Starving Singleton2
    this is Starving Singleton4
    this is Starving Singleton
    this is Starving Singleton

    解析:

    首先程序从main方法进入,执行到第一次循环的45行,开始加载类,也就意味着开始执行static模块,然后先后输出第9和20行的打印输出方法,输出3和5,解释到26行的时候因为类已经加载一次了,所以就不会执行加载类,而是执行构造函数,所以输出2,继续往下走,继续执行第三个static模块,输出4,然后到现在 类加载完成,执行第一个getInstance()返回实例,再执行print(),然后循环体再往下再次执行45行,static模块只会执行一次(不会重复打印2,3,4),单例模式也不会再执行构造函数(不会打印2),所以第二次运行到45行的时候只会执行print()。

  • 相关阅读:
    JAVA中final关键字的作用
    JAVA作用域和排序算法介绍
    JAVA的控制结构
    Java概述
    P6329 【模板】点分树 | 震波[点分树]
    BZOJ #4771. 七彩树 [主席树,链并,差分]
    CF1276F Asterisk Substrings [后缀自动机]
    P4173 残缺的字符串 [FFT]
    CF528D Fuzzy Search [FFT]
    #4589. Hard Nim [FWT]
  • 原文地址:https://www.cnblogs.com/draenei/p/4762067.html
Copyright © 2020-2023  润新知