静态成员 执行顺序

静态构造函数:
(1 )用于对静态字段、只读字段等的初始化。              
(2 )添加static 关键字,不能添加访问修饰符,因为静态构造函数都是私有的。        
(3 )类的静态构造函数在给定应用程序域中至多执行一次:只有创建类的实例或者引用类的任何静态成员才激发静态构造函数
(4 )静态构造函数是不可继承的,而且不能被直接调用。            
(5 )如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。    
(6 )任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项。  
(7 )如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数。

非静态构造函数也适用:调用任何静态成员时,先要按照文本顺序执行那些初始值设定项,先静态字段,后一般字段。

1.当一个类被实例化时,首先检查类中的静态字段是否已经初始化,如果没有初始化,将最先执行静态字段的初始化代码。(如果静态字段的初始化代码中又调用 了另一个类中的静态字段,将最优先执行另一个类中的静态字段的初始化。)接着,将执行非静态字段的代码,然后再执行类的构造函数。 
  2.当调用类的静态方法或属性时,也是首先检查类中的静态字段是否已经初始化,如果没有初始化,将最先执行静态字段的初始化代码。接着再执行静态方法或属性内部的代码。 
  3.某个函数体中存在使用了某个类的静态字段时,无论静态字段在函数体的什么位置,只要这个静态字段没有被初始化,将优先于执行这个函数之前,执行该静态字段的初始化(实际上将该类中的所有静态字段都初始化了)。

Java 代码

  1. **************************************************   
  2. *  静   态   构   造   函   数   练   习   
  3. *  (1 ) ①②③…… 为执行顺序   
  4. *  (2 )输出结果:   static A()   
  5. * static B()   
  6. * X = 1 ,   Y = 2   
  7. ***************************************************/   
  8. using System;   
  9. class A   
  10. {   
  11. public static int X;   
  12.   
  13. static A() // ④  执行完后返回到 ③   
  14. {   
  15. X = B.Y + 1 ;   
  16. Console.WriteLine("static A()");   
  17. }   
  18. }   
  19.   
  20. class B   
  21. {   
  22. public static int Y = A.X + 1 ; // ③  调用了A 的静态成员,   
  23. //  转到A 的静态构造函数---->   
  24.   
  25. static B() // ②  如果带有初始值设定项的静态字段,   
  26. //  执行该类的静态构造函数时,   
  27. //  先要按照文本顺序执行那些初始值设定项。   
  28. //  转到初始值设定项---->   
  29. {   
  30. Console.WriteLine("static B()");   
  31. }   
  32.   
  33. static void Main() // ①  程序入口,   
  34. //  如果类中包含用来开始执行的   Main  方法,   
  35. //  该类的静态构造函数将在调用   Main  方法之前执行。   
  36. //  转到B 的静态构造函数---->   
  37. {   
  38. Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);// ⑤  输出结果   
  39. Console.ReadLine();   
  40. }   
  41. }  
原文地址:https://www.cnblogs.com/jiese/p/2044037.html