Java类的静态块の二
2015-08-27 00:05
417 查看
在上一篇Java类的静态块の一中介绍到:类的静态块在类加载时候执行,执行早于构造函数,并且只执行一次。
但是在下面的例子中却发现JVM并不是把把所有的static模块都执行完成再执行其他(Java果然是解释性语言):
输出结果:
解析:
首先程序从main方法进入,执行到第一次循环的45行,开始加载类,也就意味着开始执行static模块,然后先后输出第9和20行的打印输出方法,输出3和5,解释到26行的时候因为类已经加载一次了,所以就不会执行加载类,而是执行构造函数,所以输出2,继续往下走,继续执行第三个static模块,输出4,然后到现在 类加载完成,执行第一个getInstance()返回实例,再执行print(),然后循环体再往下再次执行45行,static模块只会执行一次(不会重复打印2,3,4),单例模式也不会再执行构造函数(不会打印2),所以第二次运行到45行的时候只会执行print()。
但是在下面的例子中却发现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中的转义字符
- Java Spring开发环境搭建及简单入门示例教程
- 树莓派搭建java web服务器(一)---树莓派入门系统安装
- 树莓派搭建java web服务器(二)---SSH远程访问连接
- 工程师薪酬分析:Java 不是过去式
- 如何成为一个优秀的Java程序猿
- spring mvc ligerui
- eclipse安装pydev
- Struts2学习笔记(六):值栈(value Stack)浅析
- 传智Java常用API知识测试
- Java并发编程:Callable、Future和FutureTask
- 传智Java面向对象知识测试
- 传智Java基础知识测试
- IO流之字符流和字节流的使用_Java编程
- java中8种基本类型
- Java类的静态块の一
- java的wait和notify方法浅析
- Jenkins api java 调用
- DesignPattern_Java:Proxy Pattern
- Myeclipse中创建一个文件夹,在new时无法显示常用的文件