当我们没有在子类构造函数中写上 base(),默认会先调用父类中无参的构造函数,再调用子类。
当在有参构造函数后写上base时,只调用子类构造函数中有参的构造函数,隐藏父类无参构造函数。
父类代码:
#region 父类
/// <summary>
/// 测试构造函数——需要被构造类 Fu
/// </summary>
class Fu
{
private int x;//一个简单的私有字段
/// <summary>
/// 构造函数
/// </summary>
public Fu()
{
Console.WriteLine("会先调用这里:这是父类");
}
/// <summary>
/// 父类中的有参构造方法
/// </summary>
/// <param name="x"></param>
public Fu(int x)
{
this.x = x;
Console.WriteLine("x赋值完成");
}
/// <summary>
/// 父类构造C函数
/// </summary>
/// <param name="x"></param>
/// <param name="b"></param>
/// <param name="c"></param>
public Fu(int x, int b, string c)
{
this.x = x;
Console.WriteLine("x赋值完成" + x + b + c);
}
/// <summary>
/// 具有7个参数的构造函数
/// </summary>
/// <param name="a"></param>
/// <param name="a1"></param>
/// <param name="a2"></param>
/// <param name="a3"></param>
/// <param name="a4"></param>
/// <param name="a6"></param>
/// <param name="a5"></param>
public Fu(int a, int a1, int a2, int a3, int a4, int a6, int a5)
{
Console.WriteLine("最长参数构造运行");
Console.WriteLine(a + "|" + a1 + "|" + a2 + "|" + a3 + "|" + a4 + "|" + a5 + "|" + a6 + "|"); //在函数中让传入参数对Fu类对象进行初始化
//例如有如下多个私有字段,在类对象初始化的时候,对其变量初始化。用构造函数最为简单
this.a = a; //传入参数,在对象实例化后,对其私有变量进行赋值操作
this.a1 = a;
this.a2 = a;
this.a3 = a;
this.a4 = a;
this.a5 = a;
this.a6 = a;
}
private int a;
private int a1;
private int a2;
private int a3;
private int a4;
private int a5;
private int a6;
}
#endregion
子类代码:
#region 子类
/// <summary>
/// 派生类继承父类
/// </summary>
class Derived : Fu
{
/// <summary>
/// 会先调用父类的构造函数,然后再调用子类这边的有参构造函数
/// </summary>
//先调用父类无参,再调用子类无参
//当我们没有在子类构造函数中写上 base(),默认会先调用父类中无参的构造函数,再调用子类。
public Derived() //: base() //重新构造 :调用父类中无参的构造函数,在这里写不写调用结果一致
{
Console.WriteLine("这是派生类-无参-构造函数");
}
private int y;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// 当我们没有在子类构造函数中 写上 base(),默认会先调用父类中无参的构造函数
/// 当在有参构造函数后写上base时,只调用子类构造函数中有参的构造函数,隐藏父类无参构造函数
public Derived(int x, int y) /*: base(x)*/
{
this.y = y;
Console.WriteLine("这是y赋值完成");
}
/// <summary>
/// 多参数
/// </summary>
/// <param name="x"></param>
/// <param name="a"></param>
public Derived(int x, string a)// : base(x, x, x, x, x, x, x) //这里写了 base 会先调用父类,再调用当前子类进行构造
{
y = x;
Console.WriteLine(a + "第三方法");
}
}
#endregion
Main()调用:
#region Main 入口
/// <summary>
/// 程序
/// </summary>
class Program
{
/// <summary>
/// 主入口
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Derived d = new Derived();
Console.WriteLine("-----------------------以上为无参构造------------------------------------------");
Derived d1 = new Derived(1, 2);
Console.WriteLine("-----------------------以上为2个参数构造---------------------------------------");
Derived d2 = new Derived(1, "1");
Console.WriteLine("-----------------------以上为2个参数构造,6个私变量----------------------------");
//先调用有参的构造函数一旦被调用,无参的构造函数都不会被调用了
//先执行父类的构造函数,才执行子类的
Console.ReadLine();
}
}
#endregion
三、输出结果
会先调用这里:这是父类
这是派生类-无参-构造函数
-----------------------以上为无参构造------------------------------------------
会先调用这里:这是父类
这是y赋值完成
-----------------------以上为2个参数构造---------------------------------------
最长参数构造运行
1|1|1|1|1|1|1|
1第三方法
-----------------------以上为2个参数构造,6个私变量----------------------------
到此这篇关于C#构造函数在基类和父类中执行顺序的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持易知道(ezd.cc)。