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

在学习 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成员,他们的初始化将按照文本顺序进行,不会因为调用顺序而改变。

偶对这个问题的理解可能不准确,欢迎大家拍砖。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值