一、構造函數 構造函數是類的特殊方法,它永遠不會返回值(即使是void),並且方法名和類名相同,同樣支持重載。在使用new關鍵字創建對象時構造函數被間接調用,為對象初始化欄位和屬性的值。 無參構造函數即預設構造函數,在我們沒有創建任何構造函數時,編譯器會為我們創建一個預設構造函數,反之當我們創建了任 ...
一、構造函數
構造函數是類的特殊方法,它永遠不會返回值(即使是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)構造函數執行其代碼。