论坛首页 Java企业应用论坛

静态函数在类对象初始化时的执行顺序

浏览 2791 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-05-20   最后修改:2009-05-20
在学习 Design&Pattern 的 Singleton Pattern 的时候,因为静态初始化是在 Java/.NET 中实现 Singleton 的首选方法.
静态构造函数和实例化对象时的构造函数有什么区别,它们的关系又是什么呢?
请看下面这个例子。
class Statics
{
    public static int count = 0;
    static //Statics()
    {
        count++;
	System.out.println("In static:" + count);
    }
    public Statics()
    {
        count++;
	System.out.println("In constructor:" + count);
    }

    public static void main(String[] args)
    {
	Statics o1 = new Statics();	
	Statics o2 = new Statics();
    }
}

输出:
E:\Java\puzzle_code>java Statics
In static:1
In constructor:2
In constructor:3

1、静态成员的初始化语句会早于静态构造函数(Java中貌似没有)执行
2、在.Net中静态构造函数是由CLR调用执行的,所以静态构造函数只能是一个,同时不能还有   参数。那么静态构造函数相对于成员初始化的一些弊端都不复存在。
在Java中貌似没有静态构造函数这一说,但是有静态初始化函数。

分析此类问题,只要记住三点就行了:
1. 代码的执行顺序,代码在前的先执行;
2. 静态成员初始化语句要先于静态构造函数执行;
3. 静态成员初始化语句与静态构造函数只执行一次。

更多参考(援引别人关于C#静态函数的总结):
一个类的static构造函数在给定的应用程序域中仅执行一次。static构造函数由在应用程序域的下列事件的首次发生时触发:
1)该类的实例被创建。
2)任何一个static成员被引用
3)如果类包含执行入口Main方法,此类的static构造函数在Main方法被调用之前执行。
4)如果类包含任何staic成员,则这些static成员在static构造函数之前进行初始化。
5)如果类包含任何static方法,则这些static方法在static构造函数之后进行初始化。
6)对于存在多个static成员,他们的初始化将按照文本顺序进行,不会因为调用顺序而改变。

偶对这个问题的理解可能不准确,欢迎大家拍砖。
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics