構造函數分為:
1.實例構造函數
2.私有構造函數
3.靜態構造函數
構造函數是一種特殊的方法,主要是為了給初始化對象賦初值。
1.實例構造函數
使用new表達式創建某個類的對象時,會使用實例構造函數創建和初始化所有實例成員變量。
public class ProgramTest
{
int j;
public ProgramTest()
{
j = 4;
Console.WriteLine("I am ProgramTest,{0}", j);
}
static void Main(string[] args)
{
ProgramTest pt = new ProgramTest();
Console.Read();
}
結果為:I am ProgramTest,4
在此次實驗中,我們首先定義了一個私有成員j,經過初始化給他賦了一個初值4,當我實例化類ProgramTest時,就會執行實例構造函數。
諸如此類不帶參數的構造函數叫“默認構造函數”,如果某個類沒有構造函數,則會自動生成一個默認構造函數,並使用默認值來初始化對象字段。
public class ProgramTest
{
int j;
public ProgramTest()
{
Console.WriteLine("I am ProgramTest,{0}", j);
}
static void Main(string[] args)
{
ProgramTest pt = new ProgramTest();
Console.Read();
}
}
結果為:I am ProgramTest,0
也可以創建帶有參數的構造函數
public class ProgramTest
{
int j;
public ProgramTest(int i)
{
j = 2;
Console.WriteLine("I am ProgramTest,i={0},j={1}",i, j);
}
static void Main(string[] args)
{
ProgramTest pt = new ProgramTest(1);
Console.Read();
}
結果為:I am ProgramTest i=1,j=2
那若是一個類中既有無參構造函數,又有有參構造函數那會怎麼樣呢?
public class ProgramTest
{
int j;
public ProgramTest()
{
j = 3;
Console.WriteLine("I am ProgramTest 默認構造函數,j={0}", j);
}
public ProgramTest(int i)
{
j = 2;
Console.WriteLine("I am ProgramTest 有參構造函數,i={0},j={1}",i, j);
}
static void Main(string[] args)
{
ProgramTest pt1 = new ProgramTest();
ProgramTest pt2 = new ProgramTest(1);
Console.Read();
}
結果為:I am ProgramTest 默認構造函數 j=3
I am ProgramTest 有參構造函數 i=1,j=2
可見,若是兩者同時存在,那麼看類實例化時,是怎麼實例的。
2.私有構造函數
私有構造函數是一種特殊的實例構造函數。它通常用在只包含靜態成員的類中。
如果類具有一個或多個私有構造函數而沒有公共構造函數,則其他類(除嵌套類外)無法創建該類的實例。
public class Test
{
private Test()
{
Console.WriteLine("I am Test");
}
}
public class ProgramTest
{
int j;
private ProgramTest()
{
j = 3;
Console.WriteLine("I am ProgramTest 默認構造函數,j={0}", j);
}
static void Main(string[] args)
{
Test t = new Test();
ProgramTest pt1 = new ProgramTest();
Console.Read();
}
}
結果:這時你會發現編譯器會提示你,你無法創建Test的實例
(即使你在Test類中添加一個靜態成員,結果依然會提示因為該構造函數受其保護級別的限制而不可訪問)
若是只在自己類裡有私有類呢?
public class ProgramTest
{
int j;
private ProgramTest()
{
j = 3;
Console.WriteLine("I am ProgramTest 默認構造函數,j={0}", j);
}
static void Main(string[] args)
{
ProgramTest pt1 = new ProgramTest();
Console.Read();
}
}
結果:I am ProgranmTest 默認構造函數,j=3
注意,如果您不對構造函數使用訪問修飾符,則在默認情況下它仍為私有構造函數。但是,通常顯式地使用private修飾符來清楚地表明該類不能被實例化。
若是一個類中既有實例構造函數又有私有構造函數,那麼當實例對象是會怎麼執行呢?
public class Test
{
int i;
private Test()
{
i = 1;
Console.WriteLine("I am Test 默認構造函數 i={0}", i);
}
public Test(int i)
{
Console.WriteLine("I am Test 有參構造函數 i={0}", i);
}
}
public class ProgramTest
{
static void Main(string[] args)
{
Test t = new Test(); //編譯器提示:因為該構造函數受其保護級別的限制而不可訪問
Console.Read();
若是只執行有參構造函數呢?
public class Test
{
int i;
private Test()
{
i = 1;
Console.WriteLine("I am Test 默認構造函數 i={0}", i);
}
public Test(int i)
{
Console.WriteLine("I am Test 有參構造函數 i={0}", i);
}
}
public class ProgramTest
{
static void Main(string[] args)
{
Test t = new Test(2);
Console.Read();
}
}
結果:I am Test 有參構造函數 i=2
3.靜態構造函數
靜態構造函數用來初始化靜態變量,這個構造函數是屬於類的,而不是屬於哪個實例的。
就是說這個構造函數只會被執行一次。也就是在創建第一個實例或引用任何靜態成員之前,由.NET自動調用。
public class Test
{
static int i;
static Test()
{
i = 1;
Console.WriteLine("I am Test 默認構造函數 i={0}", i);
}
}
public class ProgramTest
{
static void Main(string[] args)
{
Test t1 = new Test();
Console.Read();
}
}
結果為:I am Test 默認構造函數 i=1
靜態構造函數的特點:
1.靜態構造函數既沒有訪問修飾符,也沒有參數。
2.在創建第一個實例或引用任何靜態成員之前,將自動調用靜態構造函數來初始化類,也就是無法直接調用靜態構造函數,也無法控制什麼時候執行靜態構造函數。
3.一個類只能有一個靜態構造函數,最多只能運行一次。
4.靜態構造函數不可以被繼承。
5.如果沒有靜態構造函數,而類中的靜態成員有初始值,那麼編譯器會自動生成默認的靜態構造函數。
如果靜態默認構造函數和公有默認構造函數同時存在,會怎麼樣呢?
public class Test
{
static int i;
static Test()
{
i = 1;
Console.WriteLine("I am Test 靜態默認構造函數 i={0}", i);
}
public Test()
{
Console.WriteLine("I am Test 公有默認構造函數 i={0}", i);
}
}
public class ProgramTest
{
static void Main(string[] args)
{
Test t1 = new Test();
Console.Read();
}
}
結果:I am Test 靜態默認構造函數 i=1
I am Test 公有默認構造函數 i=1
如果靜態默認構造函數和公有有參構造函數同時存在,我實例化類讓它調用靜態默認構造函數會怎麼樣呢?
public class Test
{
static int i;
static Test()
{
i = 1;
Console.WriteLine("I am Test 靜態默認構造函數 i={0}", i);
}
public Test(int j)
{
Console.WriteLine("I am Test 公有有參構造函數 i={0}", j);
}
}
public class ProgramTest
{
static void Main(string[] args)
{
Test t1 = new Test(); //系統會提示錯誤
Console.Read();
}
}
如果靜態默認構造函數和公有有參構造函數同時存在,我實例化類讓它調用公有構造函數會怎麼樣呢?
public class Test
{
static int i;
static Test()
{
i = 1;
Console.WriteLine("I am Test 靜態默認構造函數 i={0}", i);
}
public Test(int j)
{
Console.WriteLine("I am Test 公有有參構造函數 i={0}", j);
}
}
public class ProgramTest
{
static void Main(string[] args)
{
Test t1 = new Test(2);
Console.Read();
}
}
結果:I am Test 靜態默認構造函數 i=1
I am Test 公有有參構造函數 j=2