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

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

 /**
* 单例模式 之 饿汉模式
*
* @author Administrator
*
*/
public class SingletonStarving {
static {
System.out.println("this is Starving Singleton3");
} /*
* 1.将构造方法私有化,不能从外部直接创建对象
*/
private SingletonStarving() {
System.out.println("this is Starving Singleton2");
} static {
System.out.println("this is Starving Singleton5");
} /*
* 2.声明类的唯一实例,使用private static修饰
*/
private static SingletonStarving instance= new SingletonStarving(); static {
System.out.println("this is Starving Singleton4");
} /*
* 3.提供一个用于获取实例的方法,使用public static修饰
*/
public static SingletonStarving getInstance() {
return instance;
} public void print() {
System.out.println("this is Starving Singleton");
} public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
SingletonStarving.getInstance().print();
}
}
}

输出结果:

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类的静态块の二的更多相关文章

  1. Java类的静态块の一

    类的静态块在类加载时候执行,执行早于构造函数,并且只执行一次. 下面这个例子可以帮助理解: package untility; public class A { // 静态块 static { A c ...

  2. Java类载入器(二)——自己定义类载入器

      用户定制自己的ClassLoader能够实现以下的一些应用: 自己定义路径下查找自己定义的class类文件,或许我们须要的class文件并不总是在已经设置好的Classpath以下,那么我们必须想 ...

  3. Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序

    先看一道Java面试题: public class Baset { private String baseName = "base"; // 构造方法 public Baset() ...

  4. 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】

    目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...

  5. Java 反射理解(二)-- 动态加载类

    Java 反射理解(二)-- 动态加载类 概念 在获得类类型中,有一种方法是 Class.forName("类的全称"),有以下要点: 不仅表示了类的类类型,还代表了动态加载类 编 ...

  6. 101 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 05 通过方法实现学生类与专业类关联——方案二

    101 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 05 通过方法实现学生类与专业类关联--方案二 本文知识点:通过方法实现学生类与 ...

  7. Java学习笔记(二)——类和对象

    [1]类是模子,确定对象将会拥有的特征(属性)和行为(方法). [2]类的特点:类是对象的类型: 具有相同属性和方法的一组对象的集合. [3]属性:对象具有的各种特征(每个对象的每个属性都拥有特定值) ...

  8. 深入研究Java类载入机制

    深入研究Java类载入机制   类载入是Java程序运行的第一步,研究类的载入有助于了解JVM运行过程,并指导开发人员採取更有效的措施配合程序运行. 研究类载入机制的第二个目的是让程序能动态的控制类载 ...

  9. jvm系列一、java类的加载机制

    一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...

随机推荐

  1. Empire Strikes Back

    题意: 给定$K$个数字,求最小的正整数$n$,使得$\prod_{i=1}^{K}{a_i !} | n!$ 解法: 注意到$$\sum_{p为质数}{1/p} = O(loglogn)$$, 这样 ...

  2. Swift3.0 数组(Array)

    学习了数组的定义,创建,和元素的,增,删,改 //定义数组类型 var array1: Array<String> var array2:[String] //创建一个空数组,int类型元 ...

  3. Lightoj1000【简单A+B】

    balababalabalabala! #include<stdio.h> #include<queue> #include<string.h> #include& ...

  4. 2016四川省赛A,C【写了1w个if的水题】

    A题: #include <iostream> #include <stdio.h> #include <string.h> #include <algori ...

  5. [Xcode 实际操作]一、博主领进门-(10)Xcode右侧界面介绍

    目录:[Swift]Xcode实际操作 本文将演示Xcode右侧界面介绍. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 右上角第三个[辅助编辑器]按钮,将代码切 ...

  6. String字符串操作题

    /** * 反转键盘录入字符串 * 反转键盘录入的字符串 * 反转键盘录入的字符串 * 反转键盘录入的字符串 * */ Scanner sc = new Scanner(System.in);Stri ...

  7. CentOS(6、7)修改主机名(hostname)

    centos6需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会导致系统启动异常.首先切换到root用户. /etc/sysconfig/n ...

  8. Log4j2 - java.lang.NoSuchMethodError: com.lmax.disruptor.dsl.Disruptor

    问题 项目使用了log4j2,由于使用了全局异步打印日志的方式,还需要引入disruptor的依赖,最后使用的log4j2和disruptor的版本依赖如下: <dependency> & ...

  9. pip 参数

    pip 自带参数 pip --help pip install 自带参数 pip install --help

  10. cobian backup 11 使用

    主机和备份机器创建备份用户(bf) 在备份机器上 设置备份用户, 备份目录右键安全,添加刚刚创建的备份bf用户,并授予所有权限 设置文件夹共享,并设置共享用户为刚刚创建的bf用户 并且在高级共享设置去 ...