在上一篇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. Java应用架构设计模块化模式与OSGI摘录

    在Java中,最适合模块化的单元就是Jar文件. 代码层面我们关注的太多了,熟练的开发人员现在很少争论使用模式的好处,也不再识别哪个模式适合当前需要,因为都能够本能地使用各种设计原则和模式,从GoF的 ...

  2. 蓝桥杯 2014本科C++ B组 六角填数 枚举排列

    标题:六角填数 如图[1.png]所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不要填 ...

  3. vim vi Ubuntu 设置

    1. 在vi编辑模式下按退格键不能删除内容,按方向键不能上下左右移动?如果是则:一 在vi里非编辑模式下按冒号进入到末行命令模式,然后输入set nocompatible,回车,然后在进入vi编辑模式 ...

  4. android项目源码

    [置顶] Android精品开源项目整理_V20140221(持续更新中..) 让我们回顾下2013年有哪些精品资源:Android精品开源项目整理_V20131115(持续更新中..) 引言:   ...

  5. socket学习目录

    深入探析c# Socket http://www.cnblogs.com/tianzhiliang/archive/2010/09/08/1821623.html Http和Socket连接区别 ht ...

  6. mysql:mysql安装及一些配置和图形界面介绍

    关于mysql,我使用的不多,这次记录是在学习一位大牛的demo的契机下完成的.包括前面记录到的sqlserver的一些知识点,也是在新的项目组中协助时候学习记录的.希望通过记录加深印象和帮助后来者. ...

  7. Summit Online Judge

    题意: 询问将取值在 $[L,R]$ 的若干个整数相加,可以得到 $[x,y]$ 区间内多少个数字. 解法: 只需要考虑求 $[L,R]$ 的数字能凑出 $[1,n]$ 的多少个数字,即可得出答案. ...

  8. PHP实用小程序(一)

    <? //设置路径(默认当前php文件所在路径) $basedir = "d:/inetpub/wwwroot"; $textrows = "20"; $ ...

  9. Unity学习(六)5.x依赖打包

    http://blog.sina.com.cn/s/blog_89d90b7c0102w2ox.html unity5已经封装好了接口,所以依赖打包并没有那么神秘和复杂了. 打包: 1.定义好资源的a ...

  10. Codevs 1794 修剪花卉

    1794 修剪花卉   题目描述 Description ZZ对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题. 一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿 ...