<1>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 構造函數的執行順序
{
public class MyBaseClass
{
public MyBaseClass()
{
Console.Write("調用父類無參數的構造函數");
}
public MyBaseClass(int i)
{
Console.Write("調用父類一個參數的構造函數");
}
}
public class MyDerivedClass : MyBaseClass
{
public int age;
public static int age2;//只要類裡存在靜態變量。那麼靜態變量總是最先初始化的。
static MyDerivedClass() //既然要初始化靜態變量,就要調用靜態的構造函數。
{
age2 = 100;
Console.Write(age2);
}
public MyDerivedClass():this(5)
{
age = 101;
Console.WriteLine(age);
}
public MyDerivedClass(int i)
{
age = 102;
Console.WriteLine(age);
}
public MyDerivedClass(int i, int j)
{
Console.WriteLine("兩個變量的參數");
}
}
class Program
{
static void Main(string[] args)
{
MyDerivedClass myder = new MyDerivedClass(); //輸出100 ,"調用父類無參數的構造函數",101
//執行順序:<1>: static MyDerivedClass() <2>: public MyBaseClass() <3>:public MyDerivedClass()
//---------------------------------------------------------------------------------------------
MyDerivedClass myder2 = new MyDerivedClass(5); //輸出"調用父類無參數的構造函數",102。
//在初始化myder對象的時候已經初始化過靜態變量age2了。因為靜態構造函數最多執行一次,所以初始化myder2對象的時候就不會在繼續初始化靜態變量age2了
//執行順序:<1>: public MyBaseClass() <2>: public MyDerivedClass(int i)
//假如我想在初始化myder2對象的時候調用父類帶有一個參數的構造函數怎麼辦呢?很好辦只要在派生類的構造函數後面加一個:base(i)
/* base 關鍵字用於從派生類中訪問基類的成員;指定創建派生類實例時應調用的基類構造函數。
public MyDerivedClass(int i):base(i)
{
age = 102;
Console.WriteLine(age);
}
執行順序:<1>: public MyBaseClass(int i) <2>: public MyDerivedClass(int i)
顧這裡輸出的是 "調用父類一個參數的構造函數",102
*/
//---------------------------------------------------------------------------------------------
MyDerivedClass myder3 = new MyDerivedClass(5, 6); //輸出"調用父類無參數的構造函數","兩個變量的參數"
//執行順序:<1>: public MyBaseClass() <2>: public MyDerivedClass(int i, int j)
Console.ReadKey();
}
}
}
<2>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 構造函數的執行順序
{
public class MyBaseClass
{
public MyBaseClass()
{
Console.Write("調用父類無參數的構造函數");
}
public MyBaseClass(int x)
{
Console.Write("調用父類一個參數的構造函數");
}
}
public class MyDerivedClass : MyBaseClass
{
public int age;
public static int age2;//只要類裡存在靜態變量。那麼靜態變量總是最先初始化的。
static MyDerivedClass() //既然要初始化靜態變量,就要調用靜態的構造函數。
{
age2 = 100;
Console.Write(age2);
}
public MyDerivedClass():this(5)
{
age = 101;
Console.WriteLine(age);
}
public MyDerivedClass(int i):base(i)
{
age = 102;
Console.WriteLine(age);
}
public MyDerivedClass(int i, int j)
{
Console.WriteLine("兩個變量的參數");
}
}
class Program
{
static void Main(string[] args)
{
MyDerivedClass myder = new MyDerivedClass(); //輸出100 ,"調用父類一個參數的構造函數",102,101
//執行順序:<1>: static MyDerivedClass() <2>: public MyBaseClass(int x) <3>:public MyDerivedClass(int i) <4>:public MyDerivedClass()
//---------------------------------------------------------------------------------------------
//MyDerivedClass myder2 = new MyDerivedClass(5); //輸出"調用父類無參數的構造函數",102。
//在初始化myder對象的時候已經初始化過靜態變量age2了。因為靜態構造函數最多執行一次,所以初始化myder2對象的時候就不會在繼續初始化靜態變量age2了
//執行順序:<1>: public MyBaseClass() <2>: public MyDerivedClass(int i)
//假如我想在初始化myder2對象的時候調用父類帶有一個參數的構造函數怎麼辦呢?很好辦只要在派生類的構造-+函數後面加一個:base(i)
/* base 關鍵字用於從派生類中訪問基類的成員;指定創建派生類實例時應調用的基類構造函數。
public MyDerivedClass(int i):base(i)
{
age = 102;
Console.WriteLine(age);
}
執行順序:<1>: public MyBaseClass(int i) <2>: public MyDerivedClass(int i)
顧這裡輸出的是 "調用父類一個參數的構造函數",102
*/
//---------------------------------------------------------------------------------------------
//MyDerivedClass myder3 = new MyDerivedClass(5, 6); //輸出"調用父類無參數的構造函數","兩個變量的參數"
//執行順序:<1>: public MyBaseClass() <2>: public MyDerivedClass(int i, int j)
Console.ReadKey();
}
}
}