构造函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造函数相关的知识,希望对你有一定的参考价值。

1.没有提供构造函数,系统会提供一个无参构造函数。提供了构造函数,系统就不会踢狗默认构造函数。

 

2.私有构造函数

1 public class MyNumber
2 {
3      private int number;
4      private MyNumber(int number)
5      {
6          this.number = number;
7      }
8 }

仅有私有构造函数,类就不能在外部被实例化。它下下面两种情况下是有用的:

1.类仅当作某些静态成员或静态属性的容器,因此它永远不需要实例化。这样就像静态类一样。

2.希望类仅能通过调用某个静态成员函数来实例化(这就是类工厂方法)。

 

3.静态构造函数

1 class MyClass
2 {
3     static MyClass()
4     {
5         // 做初始化工作,只能访问类的静态成员
6     }
7 }

静态构造函数没有修饰符,它由.Net运行库调用它,所以public、private等修饰符对它没有意义。

编写静态构造函数的一个原因是,类有一些静态字段或属性,需要在第一次使用类之前,从外部源中初始化这些静态字段和属性。

静态构造函数不能带参数,一个类只能有一个静态构造函数。

静态构造函数虽然无参,但它与无参实例构造函数并不冲突,尽管它们的参数列表相同。静态构造函数会确保在实例构造函数之前执行。

静态构造函数只能访问类的静态成员,不能访问实例成员。

.Net运行库没有确保什么时候执行静态构造函数,所以不能把要求在某个特定时刻运行的代码放在静态构造函数中。

但是可以确保静态构造函数至多运行一次,即在代码引用类之前调用它。通常在第一次调用类的任何成员之前执行静态构造函数(调用静态成员或实例化之前)。

 1   //当调用静态字段时,先执行静态字段的初始化,再执行静态构造函数
 2     //当实例化类时,先执行静态字段的初始化,再执行静态构造函数,最后执行实例构造函数
 3     public class MyClass
 4     {
 5         public MyClass()
 6         {
 7             Console.WriteLine("实例构造函数");
 8         }
 9 
10         static MyClass() //只会运行一次
11         {
12             Console.WriteLine("静态构造函数");
13         }
14 
15         public static int a = 10; //只会初始化一次
16 
17         public static int b = init(); //只会初始化一次
18 
19         private static int init()
20         {
21             Console.WriteLine("静态变量 b 初始化");
22 
23             return 30;
24         }

 

以上是关于构造函数的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

防止 Proguard 删除片段的空构造函数

无法解析片段中的 ViewModelProvider 构造?

为啥要避免片段中的非默认构造函数?

片段真的需要一个空的构造函数吗?

这个嵌套类构造函数片段可以应用于泛型类吗?