一、构造函数
构造函数是类的特殊方法,它永远不会返回值(即使是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)构造函数执行其代码。