zoukankan      html  css  js  c++  java
  • static的初始化顺序

    【IT168技术文档】 static的初始化顺序

     先看个例子:

    using System;

     Class A

     {

     static int X;

     static A()

     {

     X = B.Y + 1;

     }

     }

     Class B

     {

     public static int Y = A.X + 1;

     static B() {}

     static void Main()

     {

     Console.WriteLine("X={0},Y={1}",A.X,B.Y);

     }

     }

     执行结果是X=1,Y=2

      这个例子主要考查2个方面,一是static的用法,二是static的初始化顺序。了解了static的初始化顺序和规则,这个问题答答案就很容易理解了。这里涉及到以下三类static对象:static成员,static方法,static构造函数。规则如下:

     一个类的static构造函数在给定的应用程序域中仅执行一次。static构造函数由在应用程序域的下列事件的首次发生时触发:

     1)该类的实例被创建。

     2)任何一个static成员被引用

     3)如果类包含执行入口Main方法,此类的static构造函数在Main方法被调用之前执行。

     4)如果类包含任何staic成员,则这些static成员在static构造函数之前进行初始化。

     5)如果类包含任何static方法,则这些static方法在static构造函数之后进行初始化。

     6)对于存在多个static成员,他们的初始化将按照文本顺序进行,不会因为调用顺序而改变。

     现在看看上面的应用程序,Class B中有个Main执行入口,所以B首先得到初始化,顺序是static成员Y->static构造函数。在初始化Y时,引用了A.X,编译器又开始初始化Class A(注意这时Class B的初始化并没有完成),顺序也是static成员X->static构造函数。Class A中X在定义的时候没有被赋予初始值(在定义static变量时,尽量赋予初始值),编译器会默认赋予值0(int型)。然后再执行static的构造函数,由于Class B的初始化这时还没有完成,所以B.Y的值在这时被编译器赋予默认值0,所以在A的static的构造函数执行完后,X的值变为1,然后返回B继续完成初始化,得到Y的值为2。最后执行Main,输出A.X和B.Y的值。相反地,如果将B中的Main方法移出放在一个类C中,那执行结果又是什么呢?依据以上的规则,可以很方便的得出答案。

  • 相关阅读:
    HDU 2899 Strange fuction
    HDU 2899 Strange fuction
    HDU 2199 Can you solve this equation?
    HDU 2199 Can you solve this equation?
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 699 掉落的方块(线段树?)
    Java实现 LeetCode 699 掉落的方块(线段树?)
    Java实现 LeetCode 699 掉落的方块(线段树?)
  • 原文地址:https://www.cnblogs.com/zhiji6/p/2784458.html
Copyright © 2011-2022 走看看