C#类型成员:构造函数

一、构造函数

  构造函数是类的特殊方法,它永远不会返回值(即使是void),并且方法名和类名相同,同样支持重载。在使用new关键字创建对象时构造函数被间接调用,为对象初始化字段和属性的值。

  无参构造函数即默认构造函数,在我们没有创建任何构造函数时,编译器会为我们创建一个默认构造函数,反之当我们创建了任何构造函数,编译器不会为我们创建默认构造函数。

  下面我们设计一个无构造函数的空调类,一个无默认构造函数的空调类和一个有多个构造函数的空调类,并实例化它们。

  1 /// <summary>
  2 /// 空调Air
  3 /// </summary>
  4 public class Air
  5 {
  6     #region 构造函数
  7     //默认构造函数的结构
  8     //public Air() { }
  9     #endregion
 10 
 11     #region 字段
 12     /// <summary>
 13     /// 空调温度
 14     /// </summary>
 15     public int temperature;
 16 
 17     /// <summary>
 18     /// 空调上下方向(用int量化方向,0代表下,1代表中下,2代表中,3代表中上,4代表上)
 19     /// </summary>
 20     public int verticalDirection;
 21 
 22     /// <summary>
 23     /// 空调开关(用int量化开关,0代表关,1代表开)
 24     /// </summary>
 25     public int switch_C;
 26     #endregion
 27 }
 28 /// <summary>
 29 /// 空调AirOther
 30 /// </summary>
 31 public class AirOther
 32 {
 33     #region 构造函数
 34     /// <summary>
 35     /// 一个参数构造函数
 36     /// </summary>
 37     /// <param name="num"></param>
 38     public AirOther(int num)
 39     {
 40         //verticalDirection和switch_C会被设置为默认值0。
 41         temperature = num;
 42     }
 43 
 44     /// <summary>
 45     /// 多参构造函数
 46     /// </summary>
 47     /// <param name="openOrClose">0代表关,1代表开</param>
 48     /// <param name="upOrdown">0代表下,1代表中下,2代表中,3代表中上,4代表上</param>
 49     /// <param name="num">空调温度</param>
 50     public AirOther(int openOrClose, int upOrdown, int num)
 51     {
 52         temperature = num;
 53         verticalDirection = upOrdown;
 54         switch_C = openOrClose;
 55     }
 56     #endregion
 57 
 58     #region 字段
 59     /// <summary>
 60     /// 空调温度
 61     /// </summary>
 62     public int temperature;
 63 
 64     /// <summary>
 65     /// 空调上下方向(用int量化方向,0代表下,1代表中下,2代表中,3代表中上,4代表上)
 66     /// </summary>
 67     public int verticalDirection;
 68 
 69     /// <summary>
 70     /// 空调开关(用int量化开关,0代表关,1代表开)
 71     /// </summary>
 72     public int switch_C;
 73     #endregion
 74 }
 75 /// <summary>
 76 /// 空调AirConditioner
 77 /// </summary>
 78 public class AirConditioner
 79 {
 80     #region 构造函数
 81     /// <summary>
 82     /// 无参构造函数
 83     /// </summary>
 84     public AirConditioner()
 85     {
 86         temperature = 28;
 87         verticalDirection = 3;
 88         switch_C = 0;
 89     }
 90 
 91     /// <summary>
 92     /// 一个参数构造函数
 93     /// </summary>
 94     /// <param name="num"></param>
 95     public AirConditioner(int num)
 96     {
 97         //verticalDirection和switch_C会被设置为默认值0。
 98         temperature = num;
 99     }
100 
101     /// <summary>
102     /// 多参构造函数
103     /// </summary>
104     /// <param name="openOrClose">0代表关,1代表开</param>
105     /// <param name="upOrdown">0代表下,1代表中下,2代表中,3代表中上,4代表上</param>
106     /// <param name="num">空调温度</param>
107     public AirConditioner(int openOrClose, int upOrdown, int num)
108     {
109         temperature = num;
110         verticalDirection = upOrdown;
111         switch_C = openOrClose;
112     }
113     #endregion
114 
115     #region 字段
116     /// <summary>
117     /// 空调温度
118     /// </summary>
119     public int temperature;
120 
121     /// <summary>
122     /// 空调上下方向(用int量化方向,0代表下,1代表中下,2代表中,3代表中上,4代表上)
123     /// </summary>
124     public int verticalDirection;
125 
126     /// <summary>
127     /// 空调开关(用int量化开关,0代表关,1代表开)
128     /// </summary>
129     public int switch_C;
130     #endregion
131 }
132 /// <summary>
133 /// 实现对象
134 /// </summary>
135 public class RealizeObject
136 {
137     public Realize()
138     {
139         //Air类无构造函数,创建airNotConstructor对象时会调用默认构造函数为它的所有int型字段赋默认值0。
140         Air airNotConstructor = new Air();
141 
142         //AirOther类不能使用new AirOther()创建对象,因为当我们创建了任何构造函数后,编译器不会为我们创建默认构造函数,此时如果想使用默认构造函数应显示创建。
143         //AirOther airNotDefaultConstructor = new AirOther();
144 
145         //在创建对象air过程中,调用的是AirConditioner类的无参构造函数,它为air的字段赋如下代码的值:
146         //air.temperature = 28;
147         //air.verticalDirection = 3;
148         //air.switch_C = 0;
149         AirConditioner air = new AirConditioner();
150 
151         //在创建对象airOne过程中,调用的是AirConditioner类的一个参数构造函数,它为对象的temperature赋值21,其他两个int型字段被赋默认值0。
152         AirConditioner airOne = new AirConditioner(21);
153 
154         //在创建对象airOpen18过程中,调用的是AirConditioner类的多参构造函数,并赋对应字段传入的值。
155         AirConditioner airOpen18 = new AirConditioner(1, 1, 18);
156     }
157 }

  默认构造函数为数据类型赋默认值如下:

  bool类型设置为false,

  数值类型设置为0或者0.0,

  char类型设置为单个空字符,

  DataTime类型设置为1/1/0001 12:00:00 AM,

  对象引用(包括string)设置为null。

 二、this关键字

  this关键字的作用之一是代表当前类,在方法的参数名与类的字段或属性名相同时,通过this.XXX代表类的字段或属性名,与方法的参数名区分开来。this关键字的作用之二是简化多构造函数中冗余的逻辑代码。

 1 /// <summary>
 2 /// 洗衣机的类
 3 /// </summary>
 4 public class WashingMachine
 5 {
 6     /// <summary>
 7     /// 时长(单位:分钟)
 8     /// </summary>
 9     public int duration;
10 
11     /// <summary>
12     /// 衣物的总数量
13     /// </summary>
14     public int clothesNum;
15 
16     public WashingMachine() { }
17 
18     public WashingMachine(int duration)
19     {
20         if (duration > 60)
21         {
22             duration = 60;
23         }
24         //通过this关键字区分类的字段名与构造函数的参数名
25         this.duration = duration;
26     }
27 
28     public WashingMachine(int duration, int clothesNum)
29     {
30         if (duration > 60)
31         {
32             duration = 60;
33         }
34         //通过this关键字区分类的字段名与构造函数的参数名
35         this.duration = duration;
36         this.clothesNum = clothesNum;
37     }
38 }

使用构造函数给洗衣机时长赋初始值时,超过60分钟的时长统一等于60分钟,此时多构造函数逻辑代码冗余。通过构造函数链的方式,以最多参数的构造函数为主函数,让其他构造函数通过最多参数的构造函数来初始化数据。

 1 /// <summary>
 2 /// 洗衣机的类
 3 /// </summary>
 4 public class WashingMachine
 5 {
 6     /// <summary>
 7     /// 时长(单位:分钟)
 8     /// </summary>
 9     public int duration;
10 
11     /// <summary>
12     /// 衣物的总数量
13     /// </summary>
14     public int clothesNum;
15 
16     public WashingMachine() { }
17 
18     public WashingMachine(int duration) : this(duration, 0) { }
19 
20     public WashingMachine(int clothesNum) : this(0, clothesNum) { }
21 
22     public WashingMachine(int duration, int clothesNum)
23     {
24         if (duration > 60)
25         {
26             duration = 60;
27         }
28         //通过this关键字区分类的字段名与构造函数的参数名
29         this.duration = duration;
30         this.clothesNum = clothesNum;
31     }
32 }

注意:当调用构造函数WashingMachine(int duration)时,会先进入主构造函数,主构造函数执行完成后,会返回到WashingMachine(int duration)构造函数执行其代码。

上一篇:java-如何为API级别低于26的持续时间添加到LocalDateTime


下一篇:在Java 8 / jsr310中格式化持续时间