关于非静态类的静态成员与非静态成员的初始化顺序(zhuang)

先执行下面一段代码:

public class Spooler
    {

        public string str = "";

        private static int count=0;

        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----------");
        }

        public static void Printcount()
        {
            Console.WriteLine("---------PrintCount----------,{0}",count);
        }

    }

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;

总结: 非静态成员变量、函数和构造函数 是对象级别的,因此只有在类实例化的时候才会调用,静态成员是类级别的,对象是类的对象,因此无论是类的实例化还是类中静态成员的调用,都会进行静态成员的初始化。第一次访问类的时候(任意属性和成员和类本身)调用静态构造函数和静态成员初始化,只初始化一次
这个永远比实例的早

即 Spooler  sp=new Spooler("");

sp.printcount();

Spooler  sp1=new Spooler("");

sp1.printcount();

结果显示: sp.count,sp1.count分别为2,3

 

转载于:https://www.cnblogs.com/shengel/archive/2011/04/26/2029690.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值