先执行下面一段代码:
public class Spooler
{
public string str = "";
private static bool instance_flag = false;
public Spooler(string str)
{
instance_flag = true;
}
static Spooler()
{
}
public static Spooler getSpooler()
{
if (!instance_flag)
{
return new Spooler("");
}
else
{
return null;
}
}
public void Print()
{
Console.WriteLine("----------Print----------");
}
public static void PrintStatic()
{
Console.WriteLine("----------Static Print----------");
}
}
1. 我们在用 Spooler s = new Spooler("");进行初始化对象时,无论静态变量与非静态成员变量的声明顺序如何,
程序的执行顺序为:Static Variable --> Static Constructed Function --> non-Static Variable --> non-Static Constructed Function
2. 执行 Spooler.PrintStatic();时,
程序的执行顺序为:Static Variable --> Static Constructed Function -->PrintStatic();
3. 利用singleton pattern 方式创建对象的实例时Spooler s1 = Spooler.getSpooler();,
程序的执行顺序为:Static Variable --> Static Constructed Function -->getSpooler() --> non-Static Variable --> non-Static Constructed Function;
总结: 非静态成员变量、函数和构造函数 是对象级别的,因此只有在类实例化的时候才会调用,静态成员是类级别的,对象是类的对象,因此无论是类的实例化还是类中静态成员的调用,都会进行静态成员的初始化。