您的位置:首页 > 编程语言 > Java开发

Java类的静态块の二

2015-08-27 00:05 417 查看
在上一篇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()。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: