構造函數主要是用來創建對象時為對象賦初值來初始化對象。總與new運算符一起使用在創建對象的語句中 。A a=new A();
構造函數具有和類一樣的名稱;但它是一個函數具有函數的所有特性,同一個類里面可以有多個參數不同的構造函數,也就是函數的多態。
構造函數是在實例化類時最先執行的方法,通過這個特性可以給對象賦初值。
構造函數沒有返回值,也不能用void修飾,只有訪問修飾符。
每個類中都會一個構造函數,如果用戶定義的類中沒有顯式的定義任何構造函數,編譯器就會自動為該類型生成默認構造函數,類里面沒有構造函數也可以,系統會為你自動創建無參構造函數。
例:class test //test類
{
public test()
{
//構造函數,初始化對象
}
}
構造函數,目的是用於初始化類。比如你定義了一個類A
class A
那么構造函數寫法就是
public A() //括號內可以有參數
{
//用於初始化的語句(沒有參數就叫做默認構造函數)
}
//注意:一個類可以有多個構造函數,可根據其參數個數的不同或參數類型的不同來區分它們 即構造函數的重載。
每次要用類A時,比如 A a = new A(); //如果前面定義的構造函數有參數,那這里必須傳參
構造函數不能被直接調用,必須通過new運算符在創建對象時才會自動調用;而一般的方法是在程序執行到它的時候被調用的;每次實例化(既上面的new A())一個類時,就會調用構造函數。
雖然在一般情況下,構造函數不被顯式調用,而是在創建對象時自動被調用。但是並不是不能被顯示調用。有些時候是一定要顯示調用的,只要是父類有帶參的構造函數,在子類中就必須顯示的調用父類的構造函數,因為子類的構造器在實例化時無法找到父類的構造函數(當父類有自己寫的無參構造函數時,子類也不用顯示調用)。
構造函數的重載:所謂重載,就是參數列表不同的幾個同名方法,構造函數的重載其實和方法的重載沒什么太大的區別,無非訪問修飾符為public ,沒用返回值類型。下面寫一個小例子:
1 class Animal 2 { 3 static void Main(string[] args) 4 { 5 //方法一 6 Animal animal1 = new Animal(); 7 animal1.Name = "兔子"; 8 animal1.Color = "白色"; 9 animal1.Speed = 20; 10 animal1.Run(); 11 //方法二 12 Animal animal2 = new Animal("兔子", "黑色"); 13 animal2.Run(30); 14 //方法三 15 Animal animal3 = new Animal("狗", "棕色", 50); 16 animal3.Run(); 17 Console.WriteLine(); 18 } 19 //構造函數重載 20 public Animal() 21 { 22 } 23 public Animal(string name, string color) 24 { 25 this.name = name; 26 this.color = color; 27 } 28 public Animal(string name, string color, int speed) 29 { 30 31 this.name = name; 32 33 this.color = color; 34 35 this.speed = speed; 36 }
37 //名稱 38 private string name; 39 public string Name 40 { 41 get { return name; } 42 set { name = value; } 43 } 44 //顏色 45 private string color; 46 public string Color 47 { 48 get { return color; } 49 set { color = value; } 50 } 51 //速度 52 private int speed; 53 public int Speed 54 { 55 get { return speed; } 56 set { speed = value; } 57 } 58 //方法的重載Run方法的不同實現 59 public void Run() 60 { 61 Console.WriteLine("一只" + this.color + "的" + this.name + "正在以" + this.speed + "Km/h的速度在奔跑\n"); 62 63 } 64 public void Run(int speed) 65 { 66 67 Console.WriteLine("一只" + this.color + "的" + this.name + "正在以" + speed + "km/h的速度在奔跑\n"); 68 69 } 70
71 }
結果如下圖所示:Run方法的兩種重載實現是一樣的。