zoukankan      html  css  js  c++  java
  • 关于非静态类的静态成员与非静态成员的初始化顺序(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

     

  • 相关阅读:
    Windows设置多用户同时远程登录
    Scala配置环境变量windows
    Java学习|强引用,软引用,弱引用,幻想引用有什么区别?
    Java学习|Exception和Error有什么区别?
    关于异常处理的几点建议
    win Server 2008 笔记
    .Net 初步学习笔记之三---变量
    认识与入门 MarkDown 标记语言
    C# winform基础 1、Timer不起作用 2、 设置图片透明
    IIS启动失败,启动Windows Process Activation Service时,出现错误13:数据无效 ;HTTP 错误 401.2
  • 原文地址:https://www.cnblogs.com/shengel/p/2029690.html
Copyright © 2011-2022 走看看